Як змінити порівняння таблиці за замовчуванням?


187
create table check2(f1 varchar(20),f2 varchar(20));

створює таблицю з порівнянням за замовчуванням latin1_general_ci;

alter table check2 collate latin1_general_cs;
show full columns from check2;

показує індивідуальне порівняння стовпців як "latin1_general_ci".

Тоді в чому полягає ефект команди alter table?



Можливо, ви хочете змінити правильну відповідь, оскільки я та багато інших, схоже, згодні з тим, що другий - правильний.
Ahi Tuna

Відповіді:


597

Щоб змінити набір символів за замовчуванням і порівняння таблиці, включаючи наявні стовпці (зверніть увагу на перетворення в пункт):

alter table <some_table> convert to character set utf8mb4 collate utf8mb4_unicode_ci;

Відповідь відредагували завдяки підказкам деяких коментарів:

Слід уникати рекомендування utf8. Це майже ніколи не хочеться і часто призводить до несподіваних помилок. Набір символів utf8 не повністю сумісний з UTF-8. Набір символів utf8mb4 - це те, що ви хочете, якщо ви хочете UTF-8. - Річ Ремер 28 березня 18 року о 23:41

і

Це здається досить важливим, радий, що я прочитав коментарі та дякую @RichRemer. Ніккі, я думаю, ви повинні відредагувати це у своїй відповіді, враховуючи, скільки поглядів на це отримує. Дивіться тут https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8.html і тут Яка різниця між utf8mb4 та utf8 charset у MySQL? - Полпро 12 березня о 17:46


4
Які наслідки зміни набору символів за замовчуванням? Чи оновлює наявні дані і тому потрібно пробігати таблицю та робити оновлення, блокуючи їх тощо?
грант

utf8_binкраще, чи не так? Яка різниця між utf8_binі utf8_unicode_ci?
Ясом Дотнет

1
Це лише приклад, який я використав. Різниця полягає в тому, що utf8_binзалежать від регістру і utf8_unicode_ciне залежать від регістру. Один не обов'язково краще, ніж інший - використовуйте все, що відповідає вашим потребам.
Ніккі Ервін Рамірес

12
@JasomDotnet тепер ви повинні використовувати utf8mb4_unicode_ci stackoverflow.com/questions/766809 / ...
baptx

2
Слід уникати рекомендацій utf8. Це майже ніколи не хочеться і часто призводить до несподіваних помилок. Набір utf8символів не повністю сумісний з UTF-8. Набір utf8mb4символів - це те, що вам потрібно, якщо ви хочете UTF-8.
Річ Ремер

34

MySQL має 4 рівні зіставлення: сервер, база даних, таблиця, стовпець. Якщо ви змінюєте порівняння сервера, бази даних або таблиці, ви не змінюєте налаштування для кожного стовпця, але ви змінюєте порівняння за замовчуванням.

Наприклад, якщо ви зміните зіставлення бази даних за замовчуванням, кожна нова таблиця, яку ви створите в цій базі даних, буде використовувати це зіставлення, і якщо ви зміните зіставлення таблиці за замовчуванням, кожен стовпець, створений у цій таблиці, отримає це зіставлення.


8
Насправді, у MySQL є П'ять рівнів зіставлення, є параметри зіставлення рівня за замовчуванням набір символів, про які багато хто забуває.
Devy

6
Існує також зіставлення з'єднань show variables like "collation%";, тож загальна SIX .
Дмитро Лазерка

9

Він встановлює таблицю за замовчуванням для таблиці; якщо ви створите новий стовпець, його слід порівнювати з latin_general_ci - я думаю. Спробуйте вказати порівняння для окремого стовпця і подивіться, чи це працює. MySQL має надзвичайно химерну поведінку щодо того, як він справляється з цим.


3

може знадобитися змінити таблицю SCHEMA не тільки

ALTER SCHEMA `<database name>`  DEFAULT CHARACTER SET utf8mb4  DEFAULT COLLATE utf8mb4_unicode_ci (as Rich said - utf8mb4);

(mariaDB 10)


<database name>замість<table name>
днівог

1
Дивіться мій коментар до прийнятої відповіді, чому не слід рекомендувати utf8, але utf8mb4.
Річ Ремер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.