|
|
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Переношу данные со старого сайта на обновлённый. Вдруг перестал помещаться 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 13:33 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Максим ГлушкоНачал экспериментировать: цифра и латинская буква - влезают по 65535, "ё" влезает 32767 раз. Вдвое меньше! В varchar всех трёх влезает по 255. Одинаково. Почему? Внезапно: русские буквы в UTF-8 занимают два байта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 13:37 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Максим ГлушкоВ varchar всех трёх влезает по 255. Одинаково. Потому что у varchar указывается максимальная длина в символах. А 65к указанные в Storage Requirements для text - это байты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 13:41 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Это же utf8mb4_unicode_ci, где каждый символ вместо 3 занимает 4 байта. Так почему такая избирательность непонятная? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 13:48 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Максим Глушко, У utf8 переменная длина символа. От 1 до 4 байт на символ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 14:03 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Вы умышленно игнорируете utf8mb4_unicode_ci в заголовке темы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 14:15 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Максим Глушко , если бы он игнорировал, то сказал бы от "1 до 3". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 14:26 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Единиц помещается 65k штук. Букв Q помещается 65k штук. Букв Ё помещается 32k штук. Не 16k (если единица 1 байт, а Ё 4), не 48k (если единица 3 байта, а Ё 4). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 14:32 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Максим Глушко, Исторически 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 байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 14:40 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Кажется, понял. Я думал, что в mb4 принудительно по 4 байта каждый символ. А оно вот как: символов 龍母 помещается 21k штук. Т.е. таки переменное количество байтов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 14:42 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Принудительно 4 байта - это utf32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 14:44 |
|
||
|
utf8mb4_unicode_ci и загадочное уменьшение лимита символов
|
|||
|---|---|---|---|
|
#18+
Печаль. На старом сайте куда меньше места всё занимало в cp1251. Латиница + кириллица + перевод остальных символов в значения с амперсандом. Теперь некоторые тексты и не влезают в 64k. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2018, 14:55 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39683706&tid=1829692]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 262ms |
| total: | 384ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...