Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / utf8mb4_unicode_ci и загадочное уменьшение лимита символов / 12 сообщений из 12, страница 1 из 1
06.08.2018, 13:33
    #39683706
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Переношу данные со старого сайта на обновлённый. Вдруг перестал помещаться 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
...
Рейтинг: 0 / 0
06.08.2018, 13:37
    #39683707
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Максим ГлушкоНачал экспериментировать: цифра и латинская буква - влезают по 65535, "ё" влезает 32767 раз. Вдвое меньше!

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

Почему?
Внезапно: русские буквы в UTF-8 занимают два байта.
...
Рейтинг: 0 / 0
06.08.2018, 13:41
    #39683710
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Максим ГлушкоВ varchar всех трёх влезает по 255. Одинаково.
Потому что у varchar указывается максимальная длина в символах.

А 65к указанные в Storage Requirements для text - это байты.
...
Рейтинг: 0 / 0
06.08.2018, 13:48
    #39683715
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Это же utf8mb4_unicode_ci, где каждый символ вместо 3 занимает 4 байта.
Так почему такая избирательность непонятная?
...
Рейтинг: 0 / 0
06.08.2018, 14:03
    #39683729
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Максим Глушко,

У utf8 переменная длина символа. От 1 до 4 байт на символ.
...
Рейтинг: 0 / 0
06.08.2018, 14:15
    #39683736
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Вы умышленно игнорируете utf8mb4_unicode_ci в заголовке темы?
...
Рейтинг: 0 / 0
06.08.2018, 14:26
    #39683745
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Максим Глушко , если бы он игнорировал, то сказал бы от "1 до 3".
...
Рейтинг: 0 / 0
06.08.2018, 14:32
    #39683750
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Единиц помещается 65k штук.
Букв Q помещается 65k штук.
Букв Ё помещается 32k штук. Не 16k (если единица 1 байт, а Ё 4), не 48k (если единица 3 байта, а Ё 4).
...
Рейтинг: 0 / 0
06.08.2018, 14:40
    #39683754
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Максим Глушко,

Исторически utf8 был от 1 до 6 байт на символ, но в mysql решили что им хватит 3 байт и тихо ломали не влезающие в 3 байта символы.
Потом utf8 стандарт урезали до 4 байт максимум.
Потом в Mysql 5.5.(что-то) сделали грубый костыль - utf8mb4, который в отличии от исторически дефектного utf8mb3 умеет в 4 байт на символ и соответствует стандарту. В будущем в mysql алиас кодировки utf8 планируют переключить с mb3 на mb4.
И utf8mb3 И utf8mb4 - кодировки с переменной длиной символа. Символы из 7-битной ASCII будут 1 байт занимать, а та же кириллица - уже два байта.

У типа данных text лимит 64 килобайта, а не 65 тысяч символов.
У типа данных varchar в скобках указывается максимальное число символов. Максимальный размер в байтах ограничен сверху хардлимитом в 64кб на целиком всю строку данных в табличке вместе со всеми полями.

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

В varchar всех трёх влезает по 255. Одинаково.
Повторюсь, оба наблюдения полностью соответствуют мануалу.

Максим ГлушкоЕдиниц помещается 65k штук.
Букв Q помещается 65k штук.
Букв Ё помещается 32k штук. Не 16k (если единица 1 байт, а Ё 4), не 48k (если единица 3 байта, а Ё 4).
Кириллица входит в двухбайтовый диапазон. Символ Ё - 2 байта, 0xd0 0x81
1 или Q - из диапазона 7-битного ASCII и занимают 1 байт.
...
Рейтинг: 0 / 0
06.08.2018, 14:42
    #39683756
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Кажется, понял. Я думал, что в mb4 принудительно по 4 байта каждый символ.
А оно вот как: символов 龍母 помещается 21k штук.
Т.е. таки переменное количество байтов.
...
Рейтинг: 0 / 0
06.08.2018, 14:44
    #39683757
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Принудительно 4 байта - это utf32.
...
Рейтинг: 0 / 0
06.08.2018, 14:55
    #39683761
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
Печаль. На старом сайте куда меньше места всё занимало в cp1251.
Латиница + кириллица + перевод остальных символов в значения с амперсандом.
Теперь некоторые тексты и не влезают в 64k.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / utf8mb4_unicode_ci и загадочное уменьшение лимита символов / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]