Страница 1 из 1

utf8mb4_unicode_ci и загадочное уменьшение лимита символов

Добавлено: 2018.08.06, 10:40
Maxim Glushko
Переношу данные со старого сайта на обновлённый. Вдруг перестал помещаться text в text в mysql.
Сейчас пользуюсь utf8mb4_unicode_ci, поэтому не особо напрягся, соотношение должно быть 3 к 4, допустил это.
Но начал считать символы в тексте, что не влезает. Их оказалось ~36k (из 65k). Показалось странным.

Начал экспериментировать: цифра и латинская буква - влезают по 65535, "ё" влезает 32767 раз. Вдвое меньше!

В varchar всех трёх влезает по 255. Одинаково.

Почему?

Базу данных не изменял старую, а создавал с нуля, кодировка mysql-сервера, базы и таблиц utf8mb4_unicode_ci

Код: Выделить всё

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%' 

character_set_client 	utf8mb4
character_set_connection 	utf8mb4
character_set_database 	utf8mb4
character_set_filesystem 	binary
character_set_results 	utf8mb4
character_set_server 	utf8mb4
character_set_system 	utf8
collation_connection 	utf8mb4_unicode_ci
collation_database 	utf8mb4_unicode_ci
collation_server 	utf8mb4_unicode_ci

Re: utf8mb4_unicode_ci и загадочное уменьшение лимита символов

Добавлено: 2018.08.06, 21:09
samdark
Потому что utf8mb4.

Re: utf8mb4_unicode_ci и загадочное уменьшение лимита символов

Добавлено: 2018.08.06, 21:19
Maxim Glushko
МПИО:

В varchar позволяется записывать указанное количество символов.

В text позволяется записывать указанное количество байт, а латиница занимает по одному байту, кириллица - по два, китайские - по три и так до четырёх.

В общем, не знал.
cp1251 для преимущественно кириллицы был экономнее
(с превращением редких хитрых символов в последовательности с амперсандом).

Re: utf8mb4_unicode_ci и загадочное уменьшение лимита символов

Добавлено: 2018.08.06, 21:25
samdark
Ещё и с индексами засада.

Re: utf8mb4_unicode_ci и загадочное уменьшение лимита символов

Добавлено: 2018.08.06, 22:12
Maxim Glushko
Главное, строку можно целиком 255 использовать.
А индекс можно сделать любой длины:
$this->execute("ALTER TABLE `users` ADD KEY `str10-users-email` (`email`(10))");