Сколько текста UTF-8 подходит в поле "Текст" MySQL?
Согласно MySQL, столбец text
содержит 65 535 байт.
Итак, если это законная граница, то на самом деле она будет только соответствовать примерно 32 тыс. символов UTF-8, верно? Или это одна из тех "нечетких" границ, где ребята, которые написали документы, не могут отличать символы от байтов, и фактически разрешают символы ~ 64k UTF-8, если они установлены на что-то вроде utf8_general_ci
?
Ответы
Ответ 1
Столбец A text
может содержать до 65,535
байт.
Символ utf-8
может содержать до 3 байтов.
Итак... ваш фактический предел может быть 21,844
.
См. руководство для получения дополнительной информации: http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html
Строка переменной длины. M представляет собой максимальная длина столбца в персонажи. Диапазон значений M равен 0 65535. Эффективная максимальная длина VARCHAR подлежит максимальному размер строки (65 535 байт, что разделены между всеми столбцами) и набор символов б/у. Например, utf8 персонажам может потребоваться до трех байтов на символ, поэтому VARCHAR столбец, который использует символ utf8 набор может быть объявлен как максимум 21 844 символа.
Ответ 2
Символы UTF-8 могут принимать до 4 байтов каждый, а не 2, как вы предполагаете. UTF-8 - это кодирование с переменной шириной, в зависимости от количества значимых бит в кодовой точке Unicode:
- 7 бит и ниже в кодовой точке Unicode: 1 байт в UTF-8
- От 8 до 11 бит: 2 байта в UTF-8
- От 12 до 16 бит: 3 байта
- От 17 до 21 бит: 4 байта
оригинальная спецификация UTF-8 позволяет кодировать до 31-разрядных значений Unicode, беря до 6 байтов для кодирования в UTF-8 форма. После того, как UTF-8 стал популярным, Консорциум Unicode объявил, что никогда не будет использовать кодовые точки за пределами 2 21 & thinsp; - & thinsp; 1. Теперь это стандартизировано как RFC 3629.
MySQL в настоящее время (т.е. версия 5.6) поддерживает только Unicode Basic Multilingual Plane, для которых UTF-8 требуется до 3 байтов на символ. Это означает, что текущий ответ на ваш вопрос заключается в том, что поле TEXT
может содержать не менее 21 844 символов.
В зависимости от того, как вы смотрите на него, фактические пределы выше или ниже:
-
Если вы так же считаете, что ограничение BMP в конечном итоге будет отменено в MySQL или одно из , оно будет , вы не должны рассчитывать на возможность хранить более 16383 символов в этом поле, если ваш клиент MySQL допускает произвольный ввод текста в формате Unicode.
-
С другой стороны, вы можете использовать тот факт, что UTF-8 является кодировкой с переменной шириной. Если вы знаете, что ваш текст в основном простой английский с помощью только случайного символа, отличного от ASCII, ваш эффективный предел в практике может приблизиться к максимальному значению 64 & thinsp; KB & thinsp; - & thinsp; 1 символа.
Ответ 3
Однако, когда используется как первичный ключ, MySQL предполагает, что каждый предел размера столбца добавляет ключ 3 байта.
mysql> alter table test2 modify code varchar(333) character set utf8;
Query OK, 0 rows affected (0.05 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table test2 modify code varchar(334) character set utf8;
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes
Ну, используя длинные строковые столбцы в качестве первичного ключа, как правило, это практика постели, однако я столкнулся с этой проблемой при работе с базой данных одного коммерческого (!) продукта.