在存储Json字符串的时候报错
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'column_name'
这种情况不只出现在mybatis中,其他ORM也有类似情况,
这个错误是由于插入或更新的数据长度超出了 MySQL 数据库表中该列定义的最大长度限制。
但是其实我的数据并没有超过定义varchar的最大长度,请查看自己是否超过的定义长度。
加上下面链接配置解决:
?sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'&jdbcCompliantTruncation=false
这段配置 MySQL 数据库连接的 URL 中的会话变量,影响数据库的行为:
-
sessionVariables=sql_mode='NO_ENGINE_SUBSTITUTION'
:-
sql_mode
是 MySQL 的 SQL 模式设置,它控制 SQL 语法和数据处理行为的细节。 -
NO_ENGINE_SUBSTITUTION
是 SQL 模式的一个选项。当启用时,如果 MySQL 试图创建一个存储引擎不可用的表,而未指定其他引擎,MySQL 将抛出错误,而不是使用默认的存储引擎。这个设置可以提高开发者对数据引擎的掌控。 -
影响:这个模式会阻止 MySQL 自动使用默认存储引擎(通常是 InnoDB)来替换用户指定但不可用的存储引擎,确保如果指定引擎不可用,直接报错。
-
-
jdbcCompliantTruncation=false
:-
这个参数与 JDBC 规范的遵从性有关。默认情况下,JDBC 规范要求当插入的数据超过列的最大长度时,抛出异常
Data truncation
。 -
设置
jdbcCompliantTruncation=false
表示禁用这种行为,使 MySQL 不会因为数据截断(例如插入的数据超过列定义的最大长度)而抛出异常。 -
影响:禁用
jdbcCompliantTruncation
后,MySQL 在插入超出列长度的数据时会默默截断数据,而不会抛出异常。如果不想要这种行为,建议谨慎使用这个配置。
-
总结
NO_ENGINE_SUBSTITUTION
:控制存储引擎替换行为,确保指定存储引擎不可用时抛出错误。jdbcCompliantTruncation=false
:禁用 JDBC 规范中规定的数据截断异常,允许数据被截断插入。
这两项设置改变了数据库和应用程序如何处理存储引擎替换和数据截断异常,允许更灵活的错误处理。