В 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, двойное кодирование преобразует строку в строку $sUTF8 длиной 64 символа, которая будет усечена в базе данных до 32 первых символов, соответствующих 32 первым байтам. оф $s. Вы можете подумать, что MySQL 5 ведет себя как MySQL 4, но на самом деле это вторая причина того же эффекта.