86

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

从各方面来看,这应该是有效的。有人有一些见识吗?

4

14 回答 14

93

将列类型更改为LONGTEXT

于 2015-12-18T10:14:11.723 回答
55

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

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

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

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

于 2016-01-20T19:05:11.463 回答
18

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

官方文件所述

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

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

在这里你可以找到INNODB TABLES LIMITATIONS

于 2013-09-19T14:33:21.440 回答
9

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

于 2013-09-19T18:14:03.167 回答
9

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

于 2013-09-19T14:30:36.230 回答
7

在 mysql 中,如果您将VARCHAR其更改为TEXTbcoz,则其大小为 65,535,并且如果您已经可以TEXT进行更改,则LONGTEXT仅当您需要更多时65,535

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

于 2019-09-17T10:49:45.230 回答
2

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

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

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

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

于 2014-08-18T15:07:33.903 回答
2

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

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

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

于 2019-06-06T08:43:54.627 回答
2

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

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

于 2019-02-25T07:59:23.743 回答
1

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

显示SqlFiddle

于 2013-09-19T14:35:24.230 回答
1

如果您正在使用type: DataTypes.STRING,则只需传递此字符串的长度即可DataTypes.STRING(1000)

于 2021-05-12T10:42:54.127 回答
1

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

于 2021-03-29T12:12:00.203 回答
1

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

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

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

b'1'
于 2020-08-10T08:47:09.930 回答
0

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

于 2017-06-15T05:27:52.723 回答