mysql字符串超长截断-严格sql模式

2,076 阅读1分钟

参考文档:

1.dev.mysql.com/doc/refman/…

2.dev.mysql.com/doc/refman/…

因为公司线上目前用的是5.6.x,所以这里就直说和公司线上大版本一致的情况。

5.6版本的mysql,默认的sql_mode是 NO_ENGINE_SUBSTITUTION,当varchar字段写入的值长度超过限定时,mysql会截取至合适长度存储并扔出告警而非错误,使用时需要谨慎,不要完全依赖数据库约束。案例:红包系统某字段存储一段json串,正常情况下长度不会超过1000,但由于其他原因存入了超过长度的json串,导致取出解析时异常。

解决办法:

sql_mode 增加 STRICT_ALL_TABLES或者 STRICT_TRANS_TABLES。这两种模式会让数据修改语句出现无效值时中止并回滚,区别是前者对所有表都适用,后者只对事务表适用。5.7.x默认的sql模式已经包括后者,我街默认的是5.6的规则。

所以这种情况,要么代码里自己解决,或者最好长度预留足一些。