如何创建这个表?#1071 - 指定密钥太长; 最大密钥长度为1000字节

Rap*_*lus 9 mysql

CREATE TABLE mini
(
realurl varchar(200) NOT NULL,
catagory varchar(200),
PRIMARY KEY (realurl,catagory),
FOREIGN KEY (realurl) REFERENCES main(realurl)
)
Run Code Online (Sandbox Code Playgroud)

错误:`#1071 - 指定密钥太长; 最大密钥长度为1000字节

为什么我不能创建这个表?我应该更改什么来创建此表?

S.M*_*hra 19

出现此常见问题的原因是默认情况下MySql对列名使用字符限制.这是:

INNODB utf8mb4 VARCHAR(191)
Run Code Online (Sandbox Code Playgroud)

我们需要的是以下内容:

INNODB utf8 VARCHAR(255)
Run Code Online (Sandbox Code Playgroud)

为了摆脱这个问题,我建议在创建数据库时使用utf8,同时将COLLATE设置为utf8_general_ci.我更喜欢使用以下命令在MariaDb或MySql中创建数据库:

DROP DATABASE IF EXISTS <YOUR_DATABASE_NAME>;
CREATE DATABASE <YOUR_DATABAE_NAME> DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Run Code Online (Sandbox Code Playgroud)

以上命令在我的特定场景中帮助了我.我使用' Sequelize '在运行时创建表.当我在使用简单的'CREATE DATABASE'命令创建数据库后尝试在Ubuntu中运行我的代码时,我得到了这个1071错误.

使用utf8字符集和整理运行上面的命令帮助我摆脱了错误.


小智 12

PRIMARY KEY (realurl,catagory) 大小为(200 + 200)*3 = 1,200字节,大于1,000字节限制,因为MySQL将utf8编码的字符存储为3字节.

您需要减小构成主键的字段的大小,或者可以将MySQL版本升级到最新版本.

另请参阅另一个问题:错误:指定的密钥太长; 最大密钥长度为1000字节.


Raj*_*ran 5

MySQL在InnoDB中具有767字节的前缀限制,在MyISAM中具有1000字节.这对我来说从来都不是问题,直到我开始使用UTF-16作为我的一个数据库的字符集.UTF-16每个字符最多可以使用4个字节,这意味着在InnoDB表中,您不能拥有超过191个字符的任何密钥.


Nid*_*wal 5

我解决了这个问题。使用以下命令创建数据库。

CREATE DATABASE CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)

  • CREATE DATABASE &lt;DB_NAME&gt;字符集utf8; (2认同)