MySQL字符串过长截断/设置错误导致错误

45

我有两个MySQL实例。第一个在插入数据时,如果数据太长,会截断字符串。第二个会引发错误:

ERROR 1406 (22001): Data too long for column 'xxx' at row 1

我希望第二个也能像第一个一样截断数据。 是否有任何MySQL设置可以管理此行为?


1
列的文件类型和长度是什么?在两个服务器上,相同字段是否具有相同的值? - metalfight - user868766
1
我认为列长度很重要,VARCHAR类型是通过指定最大存储字符数的长度来声明的。如果您的字符串超过了VARCHAR字段的长度,将无法存储。 - metalfight - user868766
2
尝试禁用STRICT_TRANS_TABLESSTRICT_ALL_TABLES,参考此处http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html#sqlmode_strict_all_tables。 - bansi
@metalfight-user868766 是的,我的字符串更长。问题是如何更改MySQL设置以使数据被截断而不是引发错误。 - Maksym Polshcha
@bansi 你说得对。我在我的 sql_mode 中设置了 STRICT_ALL_TABLES。移除这个设置可以解决问题。如果你把你的评论变成答案,我会接受它。 - Maksym Polshcha
显示剩余2条评论
3个回答

58
您可以禁用STRICT_TRANS_TABLESSTRICT_ALL_TABLES。这样可以自动截断插入的字符串。
摘自MySQL文档。
严格模式控制MySQL如何处理数据更改语句(如INSERT或UPDATE)中的无效或缺失值。值可能无效的原因有多种。例如,它可能与列的数据类型不匹配,或者超出了范围。当要插入的新行不包含非空列的值且该列在其定义中没有显式DEFAULT子句时,值就会缺失。(对于NULL列,如果值缺失,则插入NULL。)
参考:MySQL Server SQL Modes

这是我的问题的答案。 - Betty Mock
顺便提一句,下面的方法不应被视为有效方法——你需要在my.cnf中设置sql-mode——但你不需要NO_AUTO_CREATE_USER或任何其他东西,你只需要确保你没有STRICT_TRANS_TABLES或STRICT_ALL_TABLES或任何其他会传播这个警告的东西。实际上,sql-mode=''也可以解决这个错误。 - Ross
请确保禁止在任何无效数据的INSERTUPDATE操作中抑制错误,这真的是您想要的吗? - Paolo
禁用这些模式不仅会禁用截断错误,还会禁用许多其他错误,包括不允许将null插入到null列中,不允许将“abc”插入到“整数”列中,不允许将1000-00-00插入到日期列中等。我不确定MySQL开发人员在决定“全有或全无”时在想什么! - AaA

14
如果未启用严格的SQL模式,并且将值分配给超出列最大长度的CHAR或VARCHAR列,则该值将被截断以适合该列,并生成警告。对于非空格字符的截断,您可以使用严格的SQL模式导致发生错误(而不是警告),并阻止插入该值。请参见第6.1.7节,“服务器SQL模式”。
如何更改: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
发现了两种禁用严格模式的方法:
  1. 将以下内容添加到my.cnf
    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  2. 使用mysql控制台的方式。
    SET @@global.sql_mode= '';
在生产环境上运行之前,请进行测试。

0
如果您使用cpanel,
请替换:
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

将“into /usr/my.cnf”写入/usr/my.cnf文件中。
sql-mode=""

运行

/etc/init.d/mysql restart

NO_AUTO_CREATE_USERNO_ENGINE_SUBSTITUTION与问题中引起的严格模式错误无关。 - AaA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接