首页 文章

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

提问于
浏览
9
CREATE TABLE mini
(
realurl varchar(200) NOT NULL,
catagory varchar(200),
PRIMARY KEY (realurl,catagory),
FOREIGN KEY (realurl) REFERENCES main(realurl)
)

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

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

7 回答

  • 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 .

  • 0

    出现此常见问题的原因是默认情况下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;
    

    以上命令在我的特定场景中帮助了我 . 我使用'Sequelize ' to create tables on run time. When I tried to run my code in Ubuntu after creating database with simple ' CREATE DATABASE'命令,我得到了这个1071错误 .

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

  • 4

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

  • 17

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

    CREATE DATABASE CHARACTER SET utf8;
    
  • 1

    您可以删除“您的数据库”并再次创建:

    CREATE DATABASE mydatabase CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
    

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

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

    如果您已更改 innodb_log_file_size 尝试恢复以前的值 .

  • 5

    要解决这个问题,您只需编辑AppServiceProvider.php文件并在boot方法中设置默认字符串长度:

    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
    

相关问题