【问题标题】:"Data too long for column" - why?“列的数据太长” - 为什么?
【发布时间】:2013-09-24 16:47:30
【问题描述】:

我编写了一个 MySQL 脚本来为假设的医院记录创建一个数据库并用数据填充它。其中一个表 Department 有一个名为 Description 的列,它被声明为 varchar(200) 类型。执行描述的 INSERT 命令时出现错误:

错误 1406:第 1 行的“描述”列的数据太长。

我插入的所有字符串都少于 150 个字符。

声明如下:

CREATE TABLE Department(
    ...
    Description varchar(200)
    ...);

这是插入命令:

INSERT INTO Department VALUES
(..., 'There is some text here',...), (..., 'There is some more text over here',...);

从表面上看,这应该是可行的。有人有什么见解吗?

【问题讨论】:

  • 你的字符串是多字节 UTF-8 吗?
  • 可能涉及空白。数据从何而来?
  • 表引擎:myisam、innodb 还是哪一个?
  • 我之前遇到过这个错误,因为一个未转义的撇号
  • @STTLCU - 这是 InnoDB

标签: mysql sql


【解决方案1】:

如果你使用type: DataTypes.STRING,那么只需传递这个字符串可以像DataTypes.STRING(1000)一样多长

【讨论】:

    【解决方案2】:

    将散列密码存储到表中时也存在类似问题。更改最大列长度没有帮助。一切都变得很简单。需要从数据库中删除之前创建的表,然后用允许长度的新值测试代码。

    【讨论】:

      【解决方案3】:

      对我来说,我将列类型定义为 BIT(例如“布尔”)

      当我尝试通过 UI(工作台)设置列值“1”时,我收到“Data too long for column”错误。

      原来设置BIT值有一个特殊的语法,就是:

      b'1'
      

      【讨论】:

        【解决方案4】:

        如果你在 mysql 中使用 VARCHAR 然后将其更改为 TEXT 因为它的大小是 65,535 如果您已经可以使用TEXT,则仅当您需要更多65,535 时才使用LONGTEXT 进行更改。

        LONGTEXT 的总大小为 4,294,967,295 个字符

        【讨论】:

          【解决方案5】:

          非常老的问题,但我尝试了上面建议的所有方法,但仍然无法解决。

          事实证明,我在主表的插入/更新触发器之后通过在具有相似结构的历史表中插入记录来跟踪更改。我增加了主表列的大小,但忘记更改历史表列的大小,这造成了问题。

          我在另一个表中做了类似的更改,错误消失了。

          【讨论】:

          • 哈!我的问题也是。忘了我在那个 Django 模型上有simple_history
          【解决方案6】:

          如果您的源数据大于目标字段,并且您只想截断任何多余的字符,但又不想关闭严格模式或更改目标字段的大小,则只需将数据截断到LEFT(field_name,size) 需要的尺寸。

          INSERT INTO Department VALUES
          (..., LEFT('There is some text here',30),...), (..., LEFT('There is some more text over here',30),...);
          

          我使用“30”作为目标字段大小的示例。

          在我的一些代码中,很容易获取目标字段的大小并执行此操作。但是,如果您的代码很难做到这一点,那么请选择其他答案之一。

          【讨论】:

            【解决方案7】:

            在我的例子中,这个错误是由于输入了错误的数据类型,例如:如果它是一个长类型的列,我试图输入字符串类型。所以请检查您输入的数据和类型是否相同

            【讨论】:

              【解决方案8】:

              使用 Hibernate,您可以创建自己的 UserType。所以这就是我为这个问题所做的。就这么简单:

                  public class BytesType implements org.hibernate.usertype.UserType {
              
                       private final int[] SQL_TYPES = new int[] { java.sql.Types.VARBINARY };
                   //...
                  }
              

              当然还有更多可以通过扩展您自己的 UserType 来实现,但我只是想把它扔在那里,以供任何寻找其他方法的人使用。

              【讨论】:

                【解决方案9】:

                在将旧数据库迁移到新版本时,我遇到了类似的问题。

                将 MySQL 模式切换为不使用 STRICT。

                SET @@global.sql_mode= 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
                

                Error Code: 1406. Data too long for column - MySQL

                【讨论】:

                • 这很适合并解决了我今天面临的类似问题。只是出于好奇......这个解决方案有什么缺点吗?
                • 这取决于你的代码,因为严格模式是对mysql的额外控制,以避免插入无效数据。如果你的代码在以前版本的 mysql 中运行良好,那么在新版本中你不会有问题。长解释:dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict
                【解决方案10】:

                将列类型更改为LONGTEXT

                【讨论】:

                • 应该是正确的答案 - 而是通过禁用严格来掩盖问题,而不是修复原因
                • 附加信息:如果要存储在数据库中的文本长度超过 65535 个字符,则必须选择 MEDIUMTEXT 或 LONGTEXT,但要注意:MEDIUMTEXT 存储的字符串最大为 16 MB,LONGTEXT 最大4GB。 ;)
                【解决方案11】:

                事实证明,这是我经常犯的一个愚蠢错误。我测试的方式是,在将数据类型从 varchar(50) 更改为 varchar(200) 后,我没有重建 Department 表;我只是重新运行插入命令,列仍然为 varchar(50)。

                【讨论】:

                  【解决方案12】:

                  对于 mysql 表的单行中可以存储多少数据有一个硬性限制,无论列数或单个列的长度如何。

                  OFFICIAL DOCUMENTATION

                  中所述

                  最大行大小限制了列的数量(可能还有大小),因为所有列的总长度不能超过此大小。例如,utf8 字符每个字符最多需要三个字节,因此对于 CHAR(255) CHARACTER SET utf8 列,服务器必须为每个值分配 255 × 3 = 765 个字节。因此,一个表不能包含超过 65,535 / 765 = 85 个这样的列。

                  可变长度列的存储包括长度字节,这些字节根据行大小进行评估。例如,一个 VARCHAR(255) CHARACTER SET utf8 列需要两个字节来存储值的长度,因此每个值最多可以占用 767 个字节。

                  您可以在这里找到INNODB TABLES LIMITATIONS

                  【讨论】:

                    【解决方案13】:

                    我尝试创建一个字段为 200 个字符的表,并且我添加了两行早期 160 个字符的行,这没关系。您确定您的行少于 200 个字符吗?

                    显示SqlFiddle

                    【讨论】:

                    • 最长字符串为143个字符。
                    【解决方案14】:

                    Varchar 有其自身的限制。也许尝试将数据类型更改为文本。!

                    【讨论】:

                    • 我认为正常的 varchar 长度是 255。
                    猜你喜欢
                    • 2015-03-05
                    • 1970-01-01
                    • 2021-05-09
                    • 2021-11-06
                    • 1970-01-01
                    • 2023-02-08
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多