我编写了一个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',...);
从各方面看,这都应该有效。任何人都有一些见解?
答案 0 :(得分:43)
将列类型更改为LONGTEXT
答案 1 :(得分:38)
将旧数据库迁移到新版本时,我遇到了类似的问题。
将MySQL模式切换为不使用STRICT。
SET @@global.sql_mode= 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
答案 2 :(得分:16)
无论列数或单个列长度如何,都可以在mysql表的单行中存储多少数据存在硬性限制。
中所述最大行大小会限制列的数量(可能是大小),因为所有列的总长度不能超过此大小。例如,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个字符吗?
答案 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)