2013-08-27 73 views
21

我有两个MySQL实例。当数据太长时,第一个字符串会在插入时截断字符串。第二届一个引发错误:MySQL太长varchar截断/错误设置

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

我想:第二个截断数据也是如此。 是否有任何MySQL设置来管理此行为?

+1

什么是文件类型与列的长度是多少?你是否有相同的值,相同的两个服务器上提交 –

+0

@ metalfight-user868766不理解你关于文件类型的问题。引擎是InnoDB,列类型 - varchar。列长度​​不会改变。是的,数据库几乎完全相同。 –

+0

什么样的错误? – 7alhashmi

回答

28

您可以禁用STRICT_TRANS_TABLESSTRICT_ALL_TABLES。这允许自动截断插入的字符串。

来自MySQL Documantation的引用。

Strict mode controls how MySQL handles invalid or missing values in data-change statements such as INSERT or UPDATE. A value can be invalid for several reasons. For example, it might have the wrong data type for the column, or it might be out of range. A value is missing when a new row to be inserted does not contain a value for a non-NULL column that has no explicit DEFAULT clause in its definition. (For a NULL column, NULL is inserted if the value is missing.)

参考:MySQL Server SQL Modes

+0

这也是我的问题的答案 –

+0

顺便说一句 - 下面的方法不应该被认为是有效的 - 你需要在你的my.cnf中设置sql模式 - 但你不需要NO_AUTO_CREATE_USER或任何其他的,你只需要确保你没有STRICT_TRANS_TABLES或STRICT_ALL_TABLES或其他任何传播此警告的东西。事实上,sql-mode =''也会修复错误。 – Ross

9

如果未启用严格SQL模式,并且将值分配给超过列最大长度的CHAR或VARCHAR列,则该值将被截断以生成警告并生成警告。要截断非空格字符,可以导致发生错误(而不是警告),并通过严格的SQL模式禁止插入值。请参见第6.1.7节“服务器SQL模式”。

你可以如何改变它: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html


发现了两个方法来禁用严格模式:

  1. 添加下面my.cnf文件

    SQL模式=“NO_AUTO_CREATE_USER ,NO_ENGINE_SUBSTITUTION“

  2. 方式是使用mysql控制台。

    SET @@ global.sql_mode ='';

请在生产环境中运行之前测试它们。

+0

SET @@ global.sql_mode ='';作为一种魅力 –

1

,如果您使用的cPanel,

更换

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

到/usr/my.cnf

sql-mode="" 

运行

/etc/init.d/mysql restart