使用TINYTEXT列上的主键创建表导致错误:MySQL 1071'指定的键太长;最大密钥长度为255字节'
我已经有一段时间没有编写PHP了。我的网站是我不久前用PHP编写的,运行于一家共享托管公司,当脚本通过mysql_query执行以下查询时,开始在日志中给我以下错误: 错误本身: MySQL 1071'指定的密钥太长;最大密钥长度为255字节'使用TINYTEXT列上的主键创建表导致错误:MySQL 1071'指定的键太长;最大密钥长度为255字节',mysql,dreamhost,Mysql,Dreamhost,我已经有一段时间没有编写PHP了。我的网站是我不久前用PHP编写的,运行于一家共享托管公司,当脚本通过mysql_query执行以下查询时,开始在日志中给我以下错误: 错误本身: MySQL 1071'指定的密钥太长;最大密钥长度为255字节' 它工作了很多年。那么现在有什么问题呢?如果最大密钥长度是255字节,并且您使用UTF8编码,那么每个字符最多可以有4个字节 因此,最大值为63字节。这项工作: CREATE TABLE tbl ( idx TINYTEXT, PRIMAR
它工作了很多年。那么现在有什么问题呢?如果最大密钥长度是255字节,并且您使用UTF8编码,那么每个字符最多可以有4个字节 因此,最大值为63字节。这项工作:
CREATE TABLE tbl (
idx TINYTEXT,
PRIMARY KEY (idx(63))
);
如果最大密钥长度为255字节,并且使用UTF8编码,则每个字符最多可包含4个字节 因此,最大值为63字节。这项工作:
CREATE TABLE tbl (
idx TINYTEXT,
PRIMARY KEY (idx(63))
);
您可以查询目录,特别是,以获取给定字符集中字符的最大长度。从中可以计算不超过255字节的最大字符数
SELECT floor(255 / maxlen) maxcharlen
FROM information_schema.character_sets
WHERE character_set_name = @@character_set_database;
然后,您可以根据该值修改CREATE语句。您可以查询目录,尤其是,以获取给定字符集中字符的最大长度。从中可以计算不超过255字节的最大字符数
SELECT floor(255 / maxlen) maxcharlen
FROM information_schema.character_sets
WHERE character_set_name = @@character_set_database;
然后,您可以根据该值修改CREATE语句。数据库的字符集是什么?请尝试选择@@character\u set\u数据库?可能是每个字符超过一个字节的?@stickybit:我不知道。我无法直接访问数据库。它是从共享web托管提供程序上的PHP脚本运行的。有没有一种方法可以把它写得与编码无关?我取决于字符集。用SHOW变量如“char%”查找它;例如,只要使用大于63的数字,mysql 8就会出现错误,因为当字符集为utf8mb4时,它只能容纳63个4字节字符。@nbk:为什么我需要知道所有这些来进行查询?有没有办法指定可用的最大值,不管值是多少?根据字符集,您可以选择更大的数字。当然,你可以使用粘性位算法。但是如果你需要255也没关系,你应该改变你的表格数据库的字符集是什么?试着选择@@character\u set\u数据库?可能是每个字符超过一个字节的?@stickybit:我不知道。我无法直接访问数据库。它是从共享web托管提供程序上的PHP脚本运行的。有没有一种方法可以把它写得与编码无关?我取决于字符集。用SHOW变量如“char%”查找它;例如,只要使用大于63的数字,mysql 8就会出现错误,因为当字符集为utf8mb4时,它只能容纳63个4字节字符。@nbk:为什么我需要知道所有这些来进行查询?有没有办法指定可用的最大值,不管值是多少?根据字符集,您可以选择更大的数字。当然,你可以使用粘性位算法。但是,如果你需要255个字符,你应该改变你的表格,但如果我添加了255个ASCII字符呢?那没关系。MySQL必须做最坏的打算,我不明白。为什么同样的说法以前有效?大约几个月前,我才开始在中看到这些错误消息。@c0000fd。MySQL或存储引擎的版本有什么变化吗?但是如果我添加了255个ASCII字符呢?那没关系。MySQL必须做最坏的打算,我不明白。为什么同样的说法以前有效?大约几个月前,我才开始在中看到这些错误消息。@c0000fd。MySQL或存储引擎的版本有什么变化吗?