2011-04-02 60 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完全向後兼容,不應發生變爲亂碼或其他形式的數據丟失。

相關問題