小伙伴問到一個問題,為啥在項目中調用插入或者更新語句時超長的字無法自動截斷,而在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
查詢結果如下
?
確實自動截斷了,但是在項目中執行同樣的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的相關。
相關推薦:
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END