2008-12-04 58 views

回答

424

從MySQL docs

字符集是一組符號和 編碼的。 A 排序規則是一組 規則,用於比較 字符集中的字符。讓我們用 一個虛構的字符集來區分 。

假設我們有一個字母表 四個字母:'A','B','a','b'。我們 給每個字母一個數字:'A'= 0, 'B'= 1,'a'= 2,'b'= 3。字母 'A'是一個符號,數字0是 編碼'A',並且所有四個字母及其 編碼的組合 是字符集。

現在,假設我們想比較 兩個字符串值'A'和'B'。執行此操作的最簡單方法是查看 的編碼:0代表'A',1代表 'B'。因爲0小於1,所以我們說 'A'小於'B'。現在,我們剛剛完成的 是對我們的 字符集應用排序規則。排序規則爲規則集 (本例中只有一條規則): 「比較編碼」。我們把這個簡稱爲 二進制整理。

但是,如果我們想說 小寫字母和大寫字母是 相當於什麼呢?然後我們至少在 有兩條規則:(1)將 小寫字母'a'和'b'看作 等同於'A'和'B'; (2)然後 比較編碼。我們稱之爲 不區分大小寫的整理。這是一個 比二進制 排序規則稍微複雜一點。

在現實生活中,大多數字符集有 許多字符:不僅僅是「A」和「B」 但整個字母,有時 多個字母或東部書寫 系統有成千上萬個字符, 有很多特殊符號一起和 標點符號。此外,在現實生活中, 最歸類有很多的規則:不 只是不區分大小寫,而且 口音不敏感(即「口音」,是連接到一個字符 的符號, 德國「O」)和多字符 映射(例如兩個德語 排序中的一箇中的'ö'= 'OE'的規則)。

170

A character encoding是一種對字符進行編碼以使其適合內存的方法。也就是說,如果字符集是ISO-8859-15,歐元符號€將被編碼爲0xa4,在UTF-8中,它將是0xe282ac。

collation是如何比較字符,在latin9,有字母e é è ê f,如果排序由二進制表示,它會去e f é ê è但是當覈對設定,例如,法語,你就會有他們在你以爲他們會的順序,這是所有的e é è ê是相等的,然後f

+4

重要的是要注意,對於單個字符集可能有許多不同的排序規則。一個是「正確的」取決於文本的語義,通常由它所寫的語言決定。來自OP的 – Phil 2015-10-21 12:50:18

19

字符集是所有書寫字形的子集。字符編碼指定這些字符如何映射到數字值。某些字符編碼(如UTF-8和UTF-16)可以對通用字符集中的任何字符進行編碼。其他的,如US-ASCII或ISO-8859-1只能編碼一個小的子集,因爲它們分別使用7位和8位。由於許多標準都指定了字符集和字符編碼,因此術語「字符集」通常可以自由替換爲「字符編碼」。

排序規則包含指定如何比較字符以進行排序的規則。排序規則可以是特定於語言環境的:兩種字符的順序因語言而異。

選擇字符集和排序規則歸結爲您的應用程序是否國際化。如果不是,你的目標是什麼區域?

爲了選擇你想支持的字符集,你必須考慮你的應用程序。如果您正在存儲用戶提供的輸入,則可能很難預見您的軟件最終將使用的所有語言環境。爲了支持他們,最好從一開始就支持UCS(Unicode)。但是,這是一個成本;許多西歐字符現在需要每個字符兩個字節而不是一個字節。

如果您的數據庫使用排序規則來創建索引,並且稍後使用該索引來提供排序結果,那麼選擇正確的排序規則可以提高性能。但是,由於排序規則通常是特定於語言環境的,因此如果您需要根據另一個語言環境的規則對結果進行排序,那麼該索引將毫無價值。

2

我建議使用utf8mb4_unicode_ci,它基於用於排序和比較的Unicode標準,該標準可以在各種語言中進行精確排序。

+1

:「我要求解釋這兩者以及如何選擇它們」 – 2017-03-15 16:35:03