【问题标题】:MySQL too long varchar truncation/error settingMySQL 太长 varchar 截断/错误设置
【发布时间】:2013-08-29 19:57:26
【问题描述】:

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

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

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

【问题讨论】:

  • 列的文件类型和长度是多少?对于两台服务器上的相同文件,您是否具有相同的值
  • @metalfight-user868766 不明白您关于文件类型的问题。引擎是 InnoDB,列类型 - varchar。列的长度没有变化。是的,数据库几乎完全相同。
  • 我认为列的长度很重要,VARCHAR 类型的声明长度表示要存储的最大字符数。您的字符串是否大于 varchar 字段的长度
  • @metalfight-user868766 他知道字符串比声明的长度长。问题是他如何控制这是否会导致错误或导致值被截断为声明的长度。
  • 尝试禁用STRICT_TRANS_TABLESSTRICT_ALL_TABLES 参考这里dev.mysql.com/doc/refman/5.0/en/…

标签: mysql settings varchar


【解决方案1】:

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

引自 MySQL 文档。

严格模式控制 MySQL 如何处理无效或缺失值 数据更改语句,例如 INSERT 或 UPDATE。一个值可以是 由于几个原因无效。例如,它可能有错误的数据 列的类型,否则可能超出范围。缺少一个值 当要插入的新行不包含非 NULL 值时 在其定义中没有显式 DEFAULT 子句的列。 (为一个 NULL 列,如果缺少值,则插入 NULL。)

参考:MySQL Server SQL Modes

【讨论】:

  • 这也是我的问题的答案
  • BTW - 下面的方法不应该被认为是有效的 - 你需要在你的 my.cnf 中设置 sql-mode - 但你不需要 NO_AUTO_CREATE_USER 或任何其他,你只需要确保您没有 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES 或其他任何传播此警告的东西。事实上 sql-mode='' 也可以修复错误。
【解决方案2】:

如果未启用严格的 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= '';

请在生产环境中运行之前对其进行测试。

【讨论】:

    【解决方案3】:

    如果你使用 cpanel ,

    替换

    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    

    进入/usr/my.cnf

    sql-mode=""
    

    运行

    /etc/init.d/mysql restart
    

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 2014-02-07
      • 1970-01-01
      • 2017-01-03
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多