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;
答案 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;