Почему этот SQL-запрос на создание таблицы выдает ошибку «# 1071 - Указанный ключ слишком длинный; максимальная длина ключа составляет 767 байт »

0
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 ответа

2
Лучший ответ

Согласно этому вопросу:

MySQL принимает 3 байта на символ utf8. 255 символов - максимальный размер индекса, который вы можете указать для каждого столбца, потому что 256x3 = 768, что нарушает ограничение на 767 байт.

Поскольку вы указали utf8mb4, MySQL принимает 4 байта на символ. Из документов MySQL:

Набор символов utf8mb4 использует максимум четыре байта на символ.

Поле emailAddress имеет длину 200 символов, поэтому длина ключа будет равна 800 байтам, а ошибка явно говорит о том, что ограничение составляет 767 байт.

  • 0
    Ох, ну ладно. Спасибо за ответы. Итак, я думаю, я должен сделать это 190 или что-то
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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню