В MySQL, если я создаю новое VARCHAR(32)
поле в таблице UTF-8, означает ли это, что я могу хранить 32 байта данных в этом поле или 32 символа (многобайтовые)?
В MySQL, если я создаю новое VARCHAR(32)
поле в таблице UTF-8, означает ли это, что я могу хранить 32 байта данных в этом поле или 32 символа (многобайтовые)?
Ответы:
Этот ответ появился в верхней части моих результатов поиска Google, но был неправильным:
Путаница, вероятно, связана с тем, что тестируются разные версии mysql.
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 символа.
utf8mb4
) может хранить «💩💩💩💩💩💩💩💩💩💩» (10 стопок пу), то есть 10 символов, но 40 байтов.
это позволит вам хранить 32 многобайтовых символа
Чтобы сэкономить место с UTF-8, используйте VARCHAR вместо CHAR. В противном случае MySQL должен зарезервировать три байта для каждого символа в столбце CHAR CHARACTER SET utf8, потому что это максимально возможная длина. Например, MySQL должен зарезервировать 30 байтов для столбца CHAR (10) CHARACTER SET utf8.
CHAR
и когда я использую, он не предназначен для хранения многобайтовых символов, поэтому я в безопасности. А как насчет того VARCHAR
, уверены ли вы, что ограничение определяется для многобайтовых символов, а не для однобайтовых символов?
32 многобайтовых данных для varchar(32)
с сопоставлением utf8_unicode_ci
, я только что тестировал с XAMPP.
1234567890123456789012345678901234567890
Усечь до:
12345678901234567890123456789012
Имейте в виду, что это не обычные символы ASCII.
utf8
, но тогда у вас будет нарушена поддержка Unicode в MySQL. utf8mb4
Вместо этого вы должны использовать кодировку, потому что макс. 4 байта в символе utf-8 , а не 3, как в варианте MySQL для utf8 ...
Лучше использовать "char" для часто обновляемых таблиц, потому что общая длина данных строки будет фиксированной и быстрой. Столбцы Varchar делают размеры данных строк динамическими. Это плохо для MyISAM, но я не знаю о InnoDB и других. Например, если у вас очень узкий столбец «тип», может быть лучше использовать char (2) с кодировкой latin1, чтобы требовать только минимальное пространство.
CHAR
. Для InnoDB происходит так много всего, что споры о «динамическом / фиксированном размере строки» по существу неуместны.
CHAR
.
Если вы подключаетесь к базе данных с использованием кодировки latin1 (например, с PHP) для сохранения строки PHP UTF8 в столбце MySQL UTF8, у вас будет двойная кодировка UTF8.
Если строка UTF8 $s
имеет длину 32 символа, но 64 байта, а столбец - VARCHAR(32)
UTF8, двойное кодирование преобразует строку в строку $s
UTF8 длиной 64 символа, которая будет усечена в базе данных до 32 первых символов, соответствующих 32 первым байтам. оф $s
. Вы можете подумать, что MySQL 5 ведет себя как MySQL 4, но на самом деле это вторая причина того же эффекта.