關于MySql超長自動截斷實例詳解

小伙伴問到一個問題,為啥在項目中調用插入或者更新語句時超長的字無法自動截斷,而在navicat中直接執行是可以自動截斷的?本文主要介紹了mysql超長自動截斷實例詳解的相關資料,這里通過實例來說明如何實現自動截斷的功能,需要的朋友可以參考下,希望能幫助到大家。

如下

CREATE?TABLE?`p_app_station`?(  ?`WX_APP_ID`?varchar(20)?NOT?NULL,  ?`APP_SECRET`?varchar(33)?DEFAULT?NULL,  ?`IS_BINDING`?int(1)?DEFAULT?'0',  ?`ACCOUNT_ID`?int(13)?DEFAULT?NULL,  ?`TOKEN`?varchar(40)?DEFAULT?NULL,  ?`BIND_URL`?varchar(200)?DEFAULT?NULL,  ?`WX_APP_NAME`?varchar(50)?DEFAULT?NULL,  ?`WX_APP_SID`?varchar(50)?DEFAULT?NULL,  ?`WX_NO`?varchar(50)?DEFAULT?NULL,  ?`CREATE_USER_ID`?varchar(13)?DEFAULT?NULL,  ?`UPDATE_DATE`?datetime?DEFAULT?NULL,  ?`CREATE_DATE`?datetime?DEFAULT?NULL,  ?`UPDATE_USER_ID`?varchar(13)?DEFAULT?NULL,  ?`STATION_TYPE`?int(1)?unsigned?zerofill?DEFAULT?NULL?COMMENT?'標記類型(試用版:0,會員版:1,定制版:2)',  ?`ACTIVE_DATE`?datetime?DEFAULT?NULL?COMMENT?'使用時間截止',  ?`APP_MODULE_ID`?varchar(60)?DEFAULT?NULL?COMMENT?'推送模版消息ID',  ?PRIMARY?KEY?(`WX_APP_ID`)  )?ENGINE=InnoDB?DEFAULT?CHARSET=utf8

insert?into?p_app_station(wx_app_id)?values('12121312312312啊啊啊啊啊aassasdasd');  select?*?from?p_app_station?where?wx_app_id?like?'12121312312312%';

很明顯varchar(20) 不足以容納12121312312312啊啊啊啊啊aassasdasd

查詢結果如下

?關于MySql超長自動截斷實例詳解

確實自動截斷了,但是在項目中執行同樣的sql發現并非如此,反而報錯。

Data?truncated?for?column?'%s'?at?row?%ld

考慮到是同一個數據庫,不存在模式不同,那么可能性應該出現在jdbcDriver上。

查看jdbc源碼

private?void?setupServerForTruncationChecks()?throws?SQLException?{  ??if?(getJdbcCompliantTruncation())?{  ????if?(versionMeetsMinimum(5,?0,?2))?{  ??????String?currentSqlMode?=?this.serverVariables.get("sql_mode");  ?  ??????boolean?strictTransTablesIsSet?=?StringUtils.indexOfIgnoreCase(currentSqlMode,?"STRICT_TRANS_TABLES")?!=?-1;  ?  ??????if?(currentSqlMode?==?null?||?currentSqlMode.length()?==?0?||?!strictTransTablesIsSet)?{  ????????StringBuilder?commandBuf?=?new?StringBuilder("SET?sql_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's?handling?this?for?us?now  ??????}?else?if?(strictTransTablesIsSet)?{  ????????//?We?didn't?set?it,?but?someone?did,?so?we?piggy?back?on?it  ????????setJdbcCompliantTruncation(false);?//?server's?handling?this?for?us?now  ??????}  ?  ????}  ??}  }

查看getJdbcCompliantTruncation方法,其默認值為

private?BooleanConnectionProperty?jdbcCompliantTruncation?=?new?BooleanConnectionProperty("jdbcCompliantTruncation",?true,  ????Messages.getString("ConnectionProperties.jdbcCompliantTruncation"),?"3.1.2",?MISC_CATEGORY,?Integer.MIN_VALUE);

因此從3.1.2版本在jdbcurl中如果沒有設置jdbcCompliantTruncation那么默認將會執行不截斷并且報錯。

那么加上參數是否可以呢?

取舍一下:

如果截斷當出現比超長可能會有精度丟失的風險。

因此建議還是在程序中檢查。

目前正在做關于使用hibernate validate的相關。

相關推薦:

PHP中文字符串截斷無亂碼解決方法

PHP中文字符串截斷無亂碼解決方法

PHP中文字符串截斷無亂碼解決方法

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享