У 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 стосів poo), це 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, як у варіанті utf8 у MySQL ...
Краще використовувати "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, але насправді це друга причина такого самого ефекту.