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

时间:2013-11-16 03:01:05

标签: mysql

CREATE TABLE mini
(
realurl varchar(200) NOT NULL,
catagory varchar(200),
PRIMARY KEY (realurl,catagory),
FOREIGN KEY (realurl) REFERENCES main(realurl)
)

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

为什么我无法创建此表?我应该更改什么才能创建此表?

9 个答案:

答案 0 :(得分:18)

这个常见问题主要发生,因为默认情况下,MySql对列名使用字符限制。这是:

INNODB utf8mb4 VARCHAR(191)

我们需要的是:

INNODB utf8 VARCHAR(255)

为了解决这个问题,我建议在创建数据库时使用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;

以上命令帮助了我的具体情况。我使用&#39; Sequelize&#39;在运行时创建表。当我在创建数据库之后尝试在Ubuntu中运行我的代码时,使用简单的“创建数据库”#39;命令,我得到了1071错误。

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

答案 1 :(得分:11)

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

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

另见另一个问题:Error: Specified key was too long; max key length is 1000 bytes

答案 2 :(得分:5)

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

答案 3 :(得分:5)

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

CREATE DATABASE CHARACTER SET utf8;

答案 4 :(得分:2)

您可以删除&#34;您的数据库&#34;然后再次创建:

character-set-server  = utf8
collation-server      = utf8_general_ci

或更改配置文件。打开/etc/mysql/mariadb.conf.d/50-server.cnf并更改:

DispatchQueue.main.async{
    self.arrayOptions = myArray
    print("self.arrayOptions.count: \(self.arrayOptions.count)")
    self.tableView.reloadData()
}

答案 5 :(得分:1)

要解决此问题,您只需编辑AppServiceProvider.php文件,然后在启动方法中设置默认字符串长度即可:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

Laravel 5.4更改了默认数据库字符集,现在为utf8mb4,其中包括对存储表情符号的支持。这只会影响新的应用程序,并且只要您运行的是MySQL v5.7.7及更高版本,您就无需执行任何操作。

对于那些运行MariaDB或更旧版本的MySQL的用户,在尝试运行迁移时可能会遇到此错误:

[Illuminate\Database\QueryException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table users add unique users_email_unique(email))

[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes 

答案 6 :(得分:0)

如果您已更改innodb_log_file_size,请尝试恢复之前的值。

答案 7 :(得分:0)

尝试在My.INI文件中添加以下设置,以获取永久解决方案-

## Innodb settings to bypass error of max size 737
innodb-file-format=barracuda
innodb-file-per-table=ON
innodb-large-prefix=ON
## Above 3 didnot work so i added below
innodb_default_row_format = 'DYNAMIC'

答案 8 :(得分:0)

对于 MySQL 5.6 及更高版本,请使用以下内容:

mysql> SET GLOBAL default_storage_engine = 'InnoDB';