2011-04-02 25 views

回答

21

作为字符集,如果可以的话,肯定是UTF-8。

作为整理 - 这对于有特殊字符的语言有点讨厌。有各种类型的排序规则。他们都可以储存所有的变音符号和其他字符,但他们在不同的他们如何对待比较变音,即

u = ü 

是真还是假的;和排序(在排序顺序中,变音符号位于字母表中)。

要长话短说,你最好的选择是要么

utf8_unicode_ci

它允许不区分大小写搜索;它将ß视为ss,并使用DIN-1分类。可悲的是,像所有非二进制Unicode排序规则一样,它会将u = ü视为可怕的麻烦,因为搜索“Muller”也会返回“Müller”。您将不得不通过实时设置变音识别归类来解决此问题。

utf8_bin

此归类不具有u = ü问题,但只有大小写敏感的搜索是可能的。

我不完全确定是否有任何其他副作用使用二进制排序;我问了一个关于here的问题。


This mySQL manual page给出了不同的排序规则,他们在日常使用带来的后果很好的概述。

Here是关于mySQL中可用排序规则的一般概述。

+0

我知道这是超旧的,但是...我正在尝试应用类似于上面所述的utf8排序规则。但是,使用utf8_unicode_ci时,字符'é'编码为'?'。你知道这是为什么吗?我认为utf8有每个角色的代表。 – wright8191 2014-08-06 19:23:35

+0

@Pekka,由于'utf8'是有缺陷的(不是真正的unicode),你为什么推荐它通过'utf8mb4'? – Pacerier 2014-10-18 22:13:47

3

utf-8-general-ciutf-8-unicode-ci

要知道其中的差别: UTF-8: General? Bin? Unicode?

+3

我想你的意思是'utf8_general_ci'或'utf8_unicode_ci'。 – 2016-09-20 10:51:46

2

要支持完整的UTF-8标准您必须在MySQL中使用字符集utf8mb4和排序utf8mb4_unicode_ci

注意:当使用所谓的utf8字符集时,MySQL只支持1到3个字节的字符!这就是为什么现代Emojis不支持,因为他们使用4字节!

完全支持UTF-8标准的唯一方法是改变所有的字符集和校对和数据库本身utf8mb4utf8mb4_unicode_ci的。此外,数据库连接也需要使用utf8mb4。

MySQL服务器必须使用utf8mb4作为可以/etc/mysql/conf.d/mysql.cnf

[client] 
default-character-set = utf8mb4 

[mysql] 
default-character-set = utf8mb4 

[mysqld] 
# character-set-client-handshake = FALSE ## better not set this! 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 

现有表中手动配置默认字符集可以迁移使用以下SQL语句来utf8mb4 :

ALTER TABLE <table-name> CONVERT TO 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci; 

注:

  • 要确保表colums不会之间的任何联接通过字符集编码减慢所有表必须改变!
  • 作为索引的长度在MySQL被限制,每个索引行的字符的总数目必须由4字节相乘,并需要为小于3072

当innodb_large_prefix配置选项是对于使用 DYNAMIC和COMPRESSED行格式的InnoDB表,此 长度限制将上升为3072个字节。

要更改数据库的字符集和默认排序规则,运行以下命令:

ALTER DATABASE CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 

由于utf8mb4是UTF8完全向后兼容,不应发生变为乱码或其他形式的数据丢失。

相关问题