Подтвердить что ты не робот

Сколько текста UTF-8 подходит в поле "Текст" MySQL?

Согласно MySQL, столбец text содержит 65 535 байт.

Итак, если это законная граница, то на самом деле она будет только соответствовать примерно 32 тыс. символов UTF-8, верно? Или это одна из тех "нечетких" границ, где ребята, которые написали документы, не могут отличать символы от байтов, и фактически разрешают символы ~ 64k UTF-8, если они установлены на что-то вроде utf8_general_ci?

4b9b3361

Ответ 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

Ну, используя длинные строковые столбцы в качестве первичного ключа, как правило, это практика постели, однако я столкнулся с этой проблемой при работе с базой данных одного коммерческого (!) продукта.