这篇文章主要介绍了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&&currentSqlMode.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超长自动截断的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!