“数据对于列而言太长”-为什么?


73

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

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


10
您的字符串是多字节UTF-8吗?
NDM 2013年

可能涉及空白。数据从哪里来?
丹·布拉库克

表引擎:myisam,innodb还是哪个?
STT LCU 2013年

3
由于没有转义的撇号,我之前曾遇到过该错误
tgolisch 2013年

@STTLCU-这是InnoDB
Ben C.

Answers:



50

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

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

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

错误代码:1406。列的数据太长-MySQL


1
这非常适合并解决了我今天面临的类似问题。出于好奇...此解决方案是否有缺点?
拉维·盖拉夫·潘迪

这取决于您的代码,因为严格模式是对mysql的额外控制,以避免插入无效数据。如果您的代码在mysql的早期版本中工作正常,则新版本中不会有问题。长explantion:dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict
calraiden

17

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

官方文件中所述

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

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

在这里您可以找到INNODB表格限制



9

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



2

使用Hibernate,您可以创建自己的UserType。这就是我针对此问题所做的事情。像这样简单的事情:

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

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

扩展您自己的UserType当然还有更多实现的方法,但是我只是想把它扔给那些寻找其他方法的人。


2

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

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

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


哈!我的问题也是 忘了我simple_history在那个Django模型上。
罗斯·罗杰斯

1

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

显示SqlFiddle


最长的字符串是143个字符。
Ben C.

1

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

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


0

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


0

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

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

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

b'1'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.