Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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
使用TINYTEXT列上的主键创建表导致错误:MySQL 1071'指定的键太长;最大密钥长度为255字节'_Mysql_Dreamhost - Fatal编程技术网

使用TINYTEXT列上的主键创建表导致错误: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

我已经有一段时间没有编写PHP了。我的网站是我不久前用PHP编写的,运行于一家共享托管公司,当脚本通过mysql_query执行以下查询时,开始在日志中给我以下错误:

错误本身:

MySQL 1071'指定的密钥太长;最大密钥长度为255字节'


它工作了很多年。那么现在有什么问题呢?

如果最大密钥长度是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或存储引擎的版本有什么变化吗?