Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql &引用;数据对于“列”太长为什么?_Mysql_Sql - Fatal编程技术网

Mysql &引用;数据对于“列”太长为什么?

Mysql &引用;数据对于“列”太长为什么?,mysql,sql,Mysql,Sql,我编写了一个MySQL脚本,为假设的医院记录创建一个数据库,并用数据填充它。其中一个表Department有一个名为Description的列,该列被声明为varchar(200)类型。执行“说明”的INSERT命令时,我得到一个错误: 错误1406:对于第1行的“说明”列,数据太长 我插入的所有字符串都少于150个字符 以下是声明: CREATE TABLE Department( ... Description varchar(200) ...); 下面是插入命令:

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

从表面上看,这应该是可行的。任何人都有一些见解吗?

Varchar有自己的局限性。也许可以尝试将数据类型更改为文本

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

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

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


在这里您可以找到

我尝试创建一个字段为200个字符的表,我已经添加了两行,前面有160个字符,没有问题。您确定您的行少于200个字符吗


事实证明,就像通常的情况一样,这是我犯的一个愚蠢的错误。按照我测试的方式,在将数据类型从varchar(50)更改为varchar(200)后,我没有重建Department表;我刚刚重新运行了insert命令,列仍然是varchar(50)。

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

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

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

当然,扩展您自己的用户类型还需要实现更多功能,但我只想为任何寻找其他方法的人提供这些功能。

将列类型更改为
LONGTEXT
将旧数据库迁移到新版本时,我遇到了类似的问题

将MySQL模式切换为不使用STRICT

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

在我的例子中,此错误是由于输入了错误类型的数据造成的。例如:如果是长类型列,则我尝试输入字符串类型。因此,如果源数据大于目标字段,并且您只想删除任何额外字符,但又不想关闭严格模式或更改目标字段的大小,则请检查您输入的数据是否相同

(字段名称,大小)

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


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

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

事实证明,我对主表使用了after insert/update触发器,它通过在具有类似结构的历史记录表中插入记录来跟踪更改。我增加了主表列的大小,但忘记更改历史表列的大小,这就产生了问题


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

在mysql中,如果使用
VARCHAR
,则将其更改为
TEXT
bcoz,其大小为65535 如果你已经可以使用
TEXT
了,那么只有当你需要更多
65535
时,才可以使用
LONGTEXT
来更改它


LONGTEXT
的总大小是
4294967295
字符

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

当我试图通过UI(Workbench)设置列值“1”时,我得到了一个“数据对于列来说太长”错误

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

b'1'

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

如果您使用的是
类型:数据类型.STRING
,那么只需传递此字符串与
数据类型类似的长度即可。STRING(1000)

您的字符串是多字节UTF-8吗?可能包含空格。数据是从哪里来的?表引擎:myisam、innodb还是哪一个?因为一个未转义的apostrophe@STTLCU-我认为InnoDBNormal的varchar长度是255。最长的字符串是143个字符。这非常适合,解决了我今天面临的类似问题。出于好奇……这个解决方案有什么缺点吗?这取决于您的代码,因为严格模式是mysql的一个额外控件,可以避免插入无效数据。如果您的代码在以前版本的mysql中运行良好,那么在新版本中就不会有问题。冗长的解释:应该是正确的答案-相反,通过禁用strict来掩盖问题,而不是修复原因附加信息:如果要存储在数据库中的文本长度超过65535个字符,则必须选择MEDIUMTEXT或LONGTEXT,但要小心:MEDIUMTEXT存储的字符串最大为16MB,LONGTEXT最大为4GB。;)哈我的问题也是。忘了我在那个Django模型上。
b'1'