Сколько текста UTF-8 помещается в поле «Текст» MySQL? - PullRequest
46 голосов
/ 12 декабря 2010

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

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

Ответы [ 3 ]

73 голосов
/ 12 декабря 2010
Столбец

A text может содержать до 65,535 байтов.

Символ utf-8 может содержать до 3 байтов.

Итак ... фактический лимит может быть 21,844 символов.

См. Руководство для получения дополнительной информации: http://dev.mysql.com/doc/refman/5.1/en/string-type-overview.html

Строка переменной длины. М представляет максимальная длина столбца в персонажи. Диапазон М составляет от 0 до 65535. Эффективная максимальная длина VARCHAR подлежит максимальному размер строки (65 535 байт, что общий для всех столбцов) и набор символов используется. Например, utf8 персонажам может потребоваться до трех байт на символ, поэтому VARCHAR столбец, который использует символ utf8 набор может быть объявлен как максимум 21 844 символа.

11 голосов
/ 12 декабря 2010

Символы UTF-8 могут занимать до 4 байтов каждый, а не 2, как вы предполагаете. UTF-8 - кодировка переменной ширины , в зависимости от количества значащих битов в кодовой точке Unicode:

  • 7 битов и ниже в кодовой точке Unicode: 1 байтв UTF-8
  • от 8 до 11 бит: 2 байта в UTF-8
  • от 12 до 16 бит: 3 байта
  • от 17 до 21 бита: 4 байта

Оригинальная спецификация *1015* UTF-8 позволяет кодировать до 31-битных значений Unicode, занимая до 6 байтов для кодирования в форме UTF-8.После того, как UTF-8 стал популярным, Консорциум Unicode заявил, что они никогда не будут использовать кодовые точки, превышающие 2 21 - 1. Теперь это стандартизировано как RFC 3629 .

MySQL в настоящее время (т.е. версия 5.6) поддерживает только символы Unicode Basic Multilingual Plane , для которых UTF-8 требуется до 3 байтов на символ.Это означает, что текущий ответ на ваш вопрос состоит в том, что ваше поле TEXT может содержать не менее 21 844 символов.

В зависимости от того, как вы на него смотрите, фактические пределы выше или ниже:

  • Если вы, как и я, предполагаете, что ограничение BMP в конечном итоге будет снято в MySQL или в одном из его форков , вы не должны рассчитывать навозможность хранить более 16 383 символов в этом поле, если ваш клиент MySQL разрешает произвольный ввод текста в Unicode.

  • С другой стороны, вы можете использовать тот факт, что UTF-8кодировка переменной шириныЕсли вы знаете, что ваш текст в основном является простым английским и содержит только символы, не входящие в ASCII, ваш эффективный лимит на практике может приблизиться к максимальному пределу в 64 КБ - 1 символ.

2 голосов
/ 15 декабря 2010

Однако, когда используется как первичный ключ , 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...