mysqljson存储被截断,没有报错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysqljson存储被截断,没有报错相关的知识,希望对你有一定的参考价值。
参考技术A 1、字段类型为text2、确定存储内容不超过64K
3、存在更长内容的存储成功,短的内容存储失败
4、截断出现概率大概20%,
5、日志看参数json都是完整的,入库前都是完整的
存储过程变量中存储SQL语句被截断的问题
@SQL中存储一段动态SQL
where条件获取动态参数,执行@SQL就被截断,把where写死就能执行成功。
例, set=@name='Tom'
set @SQL='select * from tab where name =''@name'' ' 失败
set @SQL='select * from tab where name =''Tom'' ' 成功
当然我的@SQL非常长,LEN=30000多。
是我没写清楚,set @SQL='select * from tab where name ='''+@name+''''就是这样,@SQL和@name的类型都是NVARCHAR(MAX),print 输出的结果是一条被截断的SQL语句,print len(@sql)=30000,就是set @name='TOM'就截断SQL语句,直接在里面写死就可以,不知道为什么
mysql一般先拼接好SQL,再执行,如下:
set conditions = "select * from table where 1 ";
set conditions = concat(conditions," and id=",1);
set @sql = conditions;
sqlserver一般做拼接的话,如下:
set @sql = 'select * FROM tab where name = @name'追问
用SQLServer
是我没写清楚,set @SQL='select * from tab where name ='''+@name+''''就是这样,@SQL和@name的类型都是NVARCHAR(MAX),print 输出的结果是一条被截断的SQL语句,print len(@sql)=30000,就是set @name='TOM'就截断SQL语句,直接在里面写死就可以,不知道为什么
换成下面这样的
set @SQL='select * from tab where name ='''+@name+''''
以后测试的时候,可以在set完后,加条语句print @SQL,看看是什么结果,这个一般就是执行时候的语句追问
是我没写清楚,set @SQL='select * from tab where name ='''+@name+''''就是这样,@SQL和@name的类型都是NVARCHAR(MAX),print 输出的结果是一条被截断的SQL语句,print len(@sql)=30000,就是set @name='TOM'就截断SQL语句,直接在里面写死就可以,不知道为什么
追答为什么要设置成nvarchar(max)?你什么字符要这么大啊,几百几千就可以了,没有中文全字符就varchar(???)这样啊
追问开发规范就这样,要用NVARCHAR,另外我的SQL却是非常长,大概10万个字符左右
追答那个@name里面的数据可能有问题吧,可以print @name print @SQL这样一个一个的查看啊,总会找到错误的
追问print @SQL 显示的是一个被截断的SQL
追答那就是太长了还是怎么的
参考技术B set @SQL='select * from tab where name ='+@name追问是我没写清楚,set @SQL='select * from tab where name ='''+@name+''''就是这样,@SQL和@name的类型都是NVARCHAR(MAX),print 输出的结果是一条被截断的SQL语句,print len(@sql)=30000,就是set @name='TOM'就截断SQL语句,直接在里面写死就可以,不知道为什么
以上是关于mysqljson存储被截断,没有报错的主要内容,如果未能解决你的问题,请参考以下文章
Symfony,Doctrine 在存储到数据库之前截断 Json 中的字符串