Mysql Как добавить столбец как varchar (21884) с кодировкой UTF8? - PullRequest
0 голосов
/ 12 декабря 2018

Если я выполню этот запрос:

CREATE TABLE `varchar_test1` (
  `id`  tinyint(1)  NOT NULL,
   `cloumn_1` varchar(21844) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

, все в порядке.

Если я затем выполню это:

ALTER TABLE `varchar_test1` ADD COLUMN `cloumn_2` varchar(21844) NOT NULL;

Я получу ошибку:

ОШИБКА 1118 (42000): слишком большой размер строки.Максимальный размер строки для используемого типа таблицы, не считая BLOB-объектов, составляет 65535. Сюда входят накладные расходы на хранение, см. Руководство.Вы должны изменить некоторые столбцы на ТЕКСТ или BLOB

Если я выполню это:

CREATE TABLE `varchar_test2` (
`id` int NOT NULL AUTO_INCREMENT,
`cloumn_1` varchar(21844) NOT NULL,
PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Я получу:

ОШИБКА 1118 (42000)Слишком большой размер строки.Максимальный размер строки для используемого типа таблицы, не считая BLOB-объектов, составляет 65535. Сюда входят накладные расходы на хранение, см. Руководство.Вы должны изменить некоторые столбцы на TEXT или BLOB

Почему?

Running mysql --version возвращает

mysql Ver 14.14 Distrib 5.7.17, дляmacos10.12 (x86_64) с использованием оболочки EditLine

1 Ответ

0 голосов
/ 12 декабря 2018

Ваша проблема в том, что в ваших столбцах хранятся многобайтовые значения, и поэтому они превышают максимальный размер строки.

Как объясняется в документах , таблицы MySQL имеют максимальный размер строки 65 535 байт.независимо от используемого вами двигателя.Добавление двух столбцов varchar(21844) означает, что вы превысили этот предел.Это происходит потому, что CHARSET на вашей таблице равно utf8 (в настоящее время псевдоним для utf8mb3), поэтому каждый символ varchar в вашей таблице занимает максимум 3 байта (плюс 2байты для хранения длины).Это хорошо для одного столбца из 21 844 символов, но не для двух.

Чтобы это исправить, используйте TEXT (или TINYTEXT, MEDIUMTEXT и т. Д.) Вместо столбцов VARCHAR.Это приведет к тому, что значения будут храниться отдельно, поэтому каждый из ваших столбцов будет вносить только несколько байтов в размер строки.(Это также объясняется в документах .)

Кроме того, к вашему сведению: написание column, а не cloumn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...