“数据太长了” - 为什么?

时间:2013-09-19 14:26:23

标签: mysql sql

我编写了一个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',...);

从各方面看,这都应该有效。任何人都有一些见解?

14 个答案:

答案 0 :(得分:43)

将列类型更改为LONGTEXT

答案 1 :(得分:38)

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

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

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

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

答案 2 :(得分:16)

无论列数或单个列长度如何,都可以在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

答案 3 :(得分:8)

事实证明,通常情况下,这对我来说是一个愚蠢的错误。我测试这个的方式,在将数据类型从varchar(50)更改为varchar(200)之后,我没有重建Department表。我只是重新运行insert命令,仍将列作为varchar(50)。

答案 4 :(得分:7)

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

答案 5 :(得分:3)

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

    public class BytesType implements org.hibernate.usertype.UserType {

         private final int[] SQL_TYPES = new int[] { java.sql.Types.VARBINARY };
     //...
    }

当然,通过扩展自己的UserType可以实现更多功能,但我只是想为那些寻找其他方法的人抛出它。

答案 6 :(得分:1)

我尝试创建一个字段为200个字符的表,并且我添加了两行,其中包含160个字符,这样就可以了。你确定你的行少于200个字符吗?

显示SqlFiddle

答案 7 :(得分:1)

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

答案 8 :(得分:0)

在我的情况下,由于输入错误类型的数据而发生此错误,例如:如果它是长类型列,我尝试输入字符串类型。所以请检查您输入的数据和类型是否相同

答案 9 :(得分:0)

如果您的源数据大于目标字段,并且您只想截取任何多余的字符,但是您不想关闭严格模式或更改目标字段的大小,则只需将数据截取为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”作为目标字段大小的示例。

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

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

如果您使用VARCHAR,然后将其更改为TEXT bcoz,其大小为65,535 并且如果您已经可以使用TEXT进行LONGTEXT更改,则只有在您需要65,535之后才需要更改。

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

答案 12 :(得分:0)

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

当我尝试通过UI(Workbench)将列值设置为“ 1”时,出现了“数据对于列而言太长”错误。

事实证明,有一种用于设置BIT值的特殊语法,即:

b'1'

答案 13 :(得分:0)

如果您使用的是 type: DataTypes.STRING,那么只需传递此字符串的长度可以像 DataTypes.STRING(1000)