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

Длины MySQL VARCHAR и UTF-8

В MySQL, если я создаю новое поле VARCHAR(32) в таблице UTF-8, это означает, что я могу хранить 32 байта данных в этом поле или 32 символа (многобайтовый)?

4b9b3361

Ответ 1

Этот ответ появился в верхней части моих результатов поиска Google, но не был прав:

Путаница, вероятно, связана с тестированием различных версий mysql.

  • Версия 4 подсчитывает байты
  • Версия 5 подсчитывает символы

http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

MySQL интерпретирует спецификации длины в определениях столбцов символов в символьных единицах. (До MySQL 4.1 длины столбцов были интерпретированы в байтах.) Это относится к типам CHAR, VARCHAR и TEXT.

Интересно (я не думал об этом) максимальная длина столбца varchar зависит от utf8 следующим образом:

Эффективная максимальная длина VARCHAR в MySQL 5.0.3 и более поздних версиях зависит от максимального размера строки (65 535 байт, которая распределяется между всеми столбцами) и используемого набора символов. Например, для символов utf8 может потребоваться до трех байтов на символ, поэтому может быть объявлен столбцом VARCHAR, который использует набор символов utf8, максимум 21 844 символа.

Ответ 2

он позволит вам хранить 32 многобайтовых символа

Чтобы сэкономить место с помощью UTF-8, используйте VARCHAR вместо CHAR. В противном случае, MySQL должен зарезервировать три байта для каждый символ в CHAR CHARACTER SET utf8, потому что это максимально возможный длина. Например, MySQL должен зарезервировать 30 байтов для  CHAR (10) CHARACTER SET utf8.

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html

Ответ 3

32 многобайтовые данные для varchar(32) с сортировкой utf8_unicode_ci, я только что протестировал с помощью XAMPP.

1234567890123456789012345678901234567890

Получить усечение до:

12345678901234567890123456789012

Имейте в виду, что это не обычные символы ASCII.

Ответ 4

Лучше использовать "char" для высоко частых таблиц обновления, поскольку общая длина данных строки будет фиксированной и быстрой. Столбцы Varchar делают динамические размеры строк. Это не хорошо для MyISAM, но я не знаю о InnoDB и других. Например, если у вас очень узкий столбец типа, может быть лучше использовать char (2) с латинской кодировкой, чтобы требовать минимальное пространство.

Ответ 5

Если вы подключаетесь к базе данных с использованием кодировки latin1 (например, с PHP) для сохранения строки PHP UTF8 в столбце MySQL UTF8, у вас будет двойная кодировка UTF8.

Если строка UTF8 $s имеет длину 32 символа длиной 64 байта, а столбец VARCHAR(32) UTF8, двойное кодирование преобразует строку $s в строку длиной UTF8 длиной 64 символа, которая будет усечена в базы данных к ее 32 первым символам, соответствующим 32 первым байтам $s.