如何更改表的默认排序规则?


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

Answers:


597

要更改表的默认字符集和排序规则,包括现有列的字符集和排序规则(请注意转换为子句):

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

由于一些评论的提示,编辑了答案:

应避免推荐utf8。它几乎从来都不是您想要的,并且经常导致意想不到的混乱。utf8字符集与UTF-8不完全兼容。如果需要UTF-8,则需要utf8mb4字符集。– Rich Remer 18年3月28日在23:41

这似乎非常重要,很高兴我阅读了评论并感谢@RichRemer。尼克(Nikki),我认为您应该在答案中进行修改,以考虑得到多少意见。请参见https://dev.mysql.com/doc/refman/8.0/zh-CN/charset-unicode-utf8.html,以及MySQL中utf8mb4和utf8字符集之间的区别是什么?– Paulpro 3月12日17:46


4
更改默认字符集有什么含义?它会更新现有数据,因此需要遍历表并进行更新,锁定等吗?
授予

utf8_bin更好,不是吗?utf8_bin和之间有什么区别utf8_unicode_ci
Jasom Dotnet

1
那只是我使用的一个例子。区别在于utf8_bin区分大小写和utf8_unicode_ci不区分大小写。一个不一定比另一个更好-使用适合您需要的任何东西。
Nikki Erwin Ramirez

12
@JasomDotnet你现在应该使用utf8mb4_unicode_ci stackoverflow.com/questions/766809/...
baptx

2
应避免推荐utf8。它几乎从来都不是您想要的,并且经常导致意想不到的混乱。该utf8字符集是不使用UTF-8完全兼容。该utf8mb4字符集是你想要什么,如果你想UTF-8。
Rich Remer

34

MySQL有4种排序规则:服务器,数据库,表,列。如果更改服务器,数据库或表的排序规则,则不会更改每一列的设置,但是会更改默认排序规则。

例如,如果更改数据库的默认排序规则,则在该数据库中创建的每个新表都将使用该排序规则,如果更改表的默认排序规则,则在该表中创建的每个列都将获得该排序规则。


8
实际上,MySQL具有五个级别的排序规则,其中有一个字符集级别的默认排序规则设置,许多人忘记了。
Devy 2015年

6
还有连接排序规则show variables like "collation%";,所以总计为SIX
Dzmitry Lazerka '16

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>
dnivog

1
请参阅我对已接受答案的评论,为什么您不应该推荐utf8,但是utf8mb4
Rich Remer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.