MySql超长自动截断的示例分析
这篇文章主要介绍了MySql超长自动截断的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
如下
CREATETABLE`p_app_station`(`WX_APP_ID`varchar(20)NOTNULL,`APP_SECRET`varchar(33)DEFAULTNULL,`IS_BINDING`int(1)DEFAULT'0',`ACCOUNT_ID`int(13)DEFAULTNULL,`TOKEN`varchar(40)DEFAULTNULL,`BIND_URL`varchar(200)DEFAULTNULL,`WX_APP_NAME`varchar(50)DEFAULTNULL,`WX_APP_SID`varchar(50)DEFAULTNULL,`WX_NO`varchar(50)DEFAULTNULL,`CREATE_USER_ID`varchar(13)DEFAULTNULL,`UPDATE_DATE`datetimeDEFAULTNULL,`CREATE_DATE`datetimeDEFAULTNULL,`UPDATE_USER_ID`varchar(13)DEFAULTNULL,`STATION_TYPE`int(1)unsignedzerofillDEFAULTNULLCOMMENT'标记类型(试用版:0,会员版:1,定制版:2)',`ACTIVE_DATE`datetimeDEFAULTNULLCOMMENT'使用时间截止',`APP_MODULE_ID`varchar(60)DEFAULTNULLCOMMENT'推送模版消息ID',PRIMARYKEY(`WX_APP_ID`))ENGINE=InnoDBDEFAULTCHARSET=utf8
insertintop_app_station(wx_app_id)values('12121312312312啊啊啊啊啊aassasdasd');select*fromp_app_stationwherewx_app_idlike'12121312312312%';
很明显varchar(20) 不足以容纳12121312312312啊啊啊啊啊aassasdasd
查询结果如下
确实自动截断了,但是在项目中执行同样的sql发现并非如此,反而报错。
Datatruncatedforcolumn'%s'atrow%ld
考虑到是同一个数据库,不存在模式不同,那么可能性应该出现在jdbcDriver上。
查看jdbc源码
privatevoidsetupServerForTruncationChecks()throwsSQLException{if(getJdbcCompliantTruncation()){if(versionMeetsMinimum(5,0,2)){StringcurrentSqlMode=this.serverVariables.get("sql_mode");booleanstrictTransTablesIsSet=StringUtils.indexOfIgnoreCase(currentSqlMode,"STRICT_TRANS_TABLES")!=-1;if(currentSqlMode==null||currentSqlMode.length()==0||!strictTransTablesIsSet){StringBuildercommandBuf=newStringBuilder("SETsql_mode='");if(currentSqlMode!=null&¤tSqlMode.length()>0){commandBuf.append(currentSqlMode);commandBuf.append(",");}commandBuf.append("STRICT_TRANS_TABLES'");execSQL(null,commandBuf.toString(),-1,null,DEFAULT_RESULT_SET_TYPE,DEFAULT_RESULT_SET_CONCURRENCY,false,this.database,null,false);setJdbcCompliantTruncation(false);//server'shandlingthisforusnow}elseif(strictTransTablesIsSet){//Wedidn'tsetit,butsomeonedid,sowepiggybackonitsetJdbcCompliantTruncation(false);//server'shandlingthisforusnow}}}}
查看getJdbcCompliantTruncation方法,其默认值为
privateBooleanConnectionPropertyjdbcCompliantTruncation=newBooleanConnectionProperty("jdbcCompliantTruncation",true,Messages.getString("ConnectionProperties.jdbcCompliantTruncation"),"3.1.2",MISC_CATEGORY,Integer.MIN_VALUE);
因此从3.1.2版本在jdbcurl中如果没有设置jdbcCompliantTruncation那么默认将会执行不截断并且报错。
那么加上参数是否可以呢?
取舍一下:
如果截断当出现比超长可能会有精度丢失的风险。
因此建议还是在程序中检查。
目前正在做关于使用hibernate validate的相关。
感谢你能够认真阅读完这篇文章,希望小编分享的“MySql超长自动截断的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。