CREATE TABLE mini
(
realurl varchar(200) NOT NULL,
catagory varchar(200),
PRIMARY KEY (realurl,catagory),
FOREIGN KEY (realurl) REFERENCES main(realurl)
)
错误:`#1071 - 指定密钥太长;最大密钥长度为1000字节
为什么我无法创建此表?我应该更改什么才能创建此表?
答案 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';