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

Говорим о серверах, развёртывании, нагрузках, выборе и использовании разных технологий и продуктов
Ответить
Аватара пользователя
Maxim Glushko
Сообщения: 81
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

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

Сообщение Maxim Glushko » 2018.08.06, 10:40

Переношу данные со старого сайта на обновлённый. Вдруг перестал помещаться 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

Аватара пользователя
samdark
Администратор
Сообщения: 9030
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark » 2018.08.06, 21:09

Потому что utf8mb4.

Аватара пользователя
Maxim Glushko
Сообщения: 81
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

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

Сообщение Maxim Glushko » 2018.08.06, 21:19

МПИО:

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

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

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

Аватара пользователя
samdark
Администратор
Сообщения: 9030
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark » 2018.08.06, 21:25

Ещё и с индексами засада.

Аватара пользователя
Maxim Glushko
Сообщения: 81
Зарегистрирован: 2017.04.24, 19:16
Откуда: Україна, Одеса

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

Сообщение Maxim Glushko » 2018.08.06, 22:12

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

Ответить