为什么这个create table sql查询给出了错误“#1071 - 指定密钥太长;最大密钥长度为767字节”

时间:2018-02-21 08:50:16

标签: mysql

CREATE TABLE IF NOT EXISTS members_table (
     `id` int(10) NOT NULL AUTO_INCREMENT,
     `customerNumber` varchar(10) DEFAULT NULL,
     `firstName` varchar(64) NOT NULL,
     `lastName` varchar(64) NOT NULL,
     `address` varchar(64) DEFAULT NULL,
     `city` varchar(32) DEFAULT NULL,
     `state` varchar(2) DEFAULT NULL,
     `country` varchar(2) DEFAULT NULL,
     `zipCode` varchar(5) NOT NULL,
     `phoneNumber` varchar(12) DEFAULT NULL,
     `emailAddress` varchar(200) NOT NULL,
     `dateOfBirth` varchar(10) DEFAULT NULL,
     `subscribe` tinyint(1) DEFAULT NULL,
     `password` varchar(34) DEFAULT NULL,
     `resetKey` varchar(34) DEFAULT NULL,
     `joinDate` datetime  NOT NULL,
     `active` tinyint(1) DEFAULT NULL,
     `deleted` tinyint(1) DEFAULT NULL,
     PRIMARY KEY (`id`),
     UNIQUE KEY `emailAddress` (`emailAddress`)
    ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2 个答案:

答案 0 :(得分:2)

根据this问题:

  

MySQL假定每个utf8字符有3个字节。 255个字符是您可以为每列指定的最大索引大小,因为256x3 = 768,它打破了767字节的限制。

由于您指定了utf8mb4归类,因此MySQL假定每个字符有4个字节。来自MySQL docs

  

utf8mb4字符集每个字符最多使用四个字节。

您的emailAddress字段最长为200个字符,因此密钥长度为800字节,而错误明确表示限制为767字节。

答案 1 :(得分:0)

MySQL假定字符串中每个字符的字节数最差。对于MySQL'utf8'编码,每个字符3个字节,因为该编码不允许超出U + FFFF的字符。对于MySQL的'utf8mb4'编码,它是每个字符4个字节,因为这就是MySQL所谓的实际UTF-8。

使用utf8代替utf8mb4

试试这个

CREATE TABLE IF NOT EXISTS members_table (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `customerNumber` varchar(10) DEFAULT NULL,
 `firstName` varchar(64) NOT NULL,
 `lastName` varchar(64) NOT NULL,
 `address` varchar(64) DEFAULT NULL,
 `city` varchar(32) DEFAULT NULL,
 `state` varchar(2) DEFAULT NULL,
 `country` varchar(2) DEFAULT NULL,
 `zipCode` varchar(5) NOT NULL,
 `phoneNumber` varchar(12) DEFAULT NULL,
 `emailAddress` varchar(200) NOT NULL,
 `dateOfBirth` varchar(10) DEFAULT NULL,
 `subscribe` tinyint(1) DEFAULT NULL,
 `password` varchar(34) DEFAULT NULL,
 `resetKey` varchar(34) DEFAULT NULL,
 `joinDate` datetime  NOT NULL,
 `active` tinyint(1) DEFAULT NULL,
 `deleted` tinyint(1) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `emailAddress` (`emailAddress`)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;