數據庫編碼及排序規則探討

  1. 規則

[強制]所有數據表使用 utf8mb4 編碼,在創建數據庫時指明使用 utf8mb4,會被繼承。比較規則統一設置爲
utf8mb4 bin”,大小寫敏感。
 
  1. 規則的背後

2.1 Charset,Collation

在 MySQL 中,創建數據庫時需要指定字符集(Charset)和校對規則(Collation)。
  • Charset 定義了數據庫中可以使用的字符集,
  • Collation 則定義瞭如何比較和排序這些字符。
 
具體來說,字符集 Charset 是指用於存儲數據時所採用的編碼方式,其目的是爲了把各種語言的字符都能夠正確地存儲在數據庫中。MySQL 支持許多不同的字符集,例如 utf8、utf8mb4、gbk 等等。
其中,utf8mb4 是目前最常用的字符集之一它支持包括 Emoji 表情等的所有 Unicode 字符。
 

2.2 以下是 utf8、utf8mb4 和 gbk 三種字符集的比較:

字符集 碼點範圍 編碼方式 最大字節數 支持的字符
utf8 U+0000~U+7F, U+0080~U+FFFF 變長(1-3字節) 3 英文、歐洲語言、中文等部分非常用漢字
utf8mb4 U+0000~U+10FFFF 變長(1-4字節) 4 包含 Emoji 表情在內的所有 Unicode 字符
gbk GBK 標準規定的字符集範圍 變長(1-2字節) 2 中文、英文、日文等多種語言,不支持 Emoji
從上表可以看出,這三種字符集的主要區別在於支持的碼點範圍和最大字節數:
  • utf8:最早的 MySQL 字符集,支持絕大部分常用字符,但不支持 Emoji 表情等一些特殊字符。編碼方式爲變長編碼,最大字節數爲 3 字節。
  • utf8mb4:MySQL 5.5.3 版本以後推出的字符集,支持 Unicode 的全部碼點範圍,包括 Emoji 表情等特殊符號。編碼方式爲變長編碼,最大字節數爲 4 字節。
  • gbk:GBK 是中國國家標準 GB 2312-1980 擴展出來的字符集,支持中文、英文、日文等多種語言,但不支持 Emoji 表情等特殊字符。編碼方式爲變長編碼,最大字節數爲 2 字節。
 

2.3 如何選擇

總之,在選擇 MySQL 的字符集時,應根據實際需求選擇適合的字符集。
  • 如果需要支持包括 Emoji 表情在內的所有 Unicode 字符,則應該選擇 utf8mb4 字符集;
  • 如果只需要支持中文、英文、日文等少數語言,則可以選擇 gbk 字符集。
 
而校對規則 Collation 則是指定義了字符集上的比較規則,也就是如何比較和排序字符。
不同的校對規則會影響到數據的查詢和排序效果,因此在設定校對規則時需要考慮實際需求。
例如,如果需要對中文進行排序,則應該選擇一個適合中文的校對規則。
在 MySQL 中,每個字符集都對應着多種不同的校對規則。
通常情況下,在建庫時可以直接使用字符集默認的校對規則,並根據實際需求進行調整。
 
總之,Charset 和 Collation 都是建立數據庫時需要指定的重要參數,它們分別定義了數據存儲時所採用的編碼方式和字符比較規則,對於保證數據的正確性和可靠性至關重要。
 
 

2.4 mysql 中utf8mb4 字符集 collection默認是什麼

在 MySQL 中,默認情況下,使用 utf8mb4 字符集時的校對規則(Collation)是 utf8mb4_unicode_ci。這是因爲 utf8mb4_unicode_ci 是一個通用的校對規則,可以支持所有 Unicode 字符,並且能夠正確地進行排序和比較。
具體來說,utf8mb4_unicode_ci 校對規則會先將字符串進行轉換,然後再按照一定的規則進行排序。它會將一些特殊字符轉換成常規字符,例如把一些帶有變音符號的字符轉換爲對應的無音符號的字符,以便更好地進行排序和比較。
另外,除了 utf8mb4_unicode_ci 校對規則外,MySQL 還提供了許多其他的校對規則,例如 utf8mb4_bin、utf8mb4_general_ci 等等。這些校對規則都具有不同的特點和適用場景,在實際開發中需要根據實際需求進行選擇。
總之,MySQL 中 utf8mb4 字符集默認採用 utf8mb4_unicode_ci 校對規則,這是一個通用的校對規則,可以支持所有 Unicode 字符,並且能夠正確地進行排序和比較。
 
 

2.5 collection規則 utf8mb4_unicode_ci vs utf8mb4_bin

以下是 utf8mb4_unicode_ci 和 utf8mb4_bin 兩種校對規則的比較:
校對規則 支持字符集 排序方式 大小寫敏感 空格敏感 Unicode 字符支持 適用場景
utf8mb4_unicode_ci utf8mb4、utf8 按照 Unicode 字符排序 支持 一般情況下使用
utf8mb4_bin utf8mb4、utf8 按照字節編碼排序 不支持 只關注字符編碼而不是字符本身的場景(如密碼等敏感信息的存儲)
從上表可以看出,utf8mb4_unicode_ci 和 utf8mb4_bin 兩種校對規則在排序方式、大小寫敏感、空格敏感和 Unicode 字符支持等方面均有所不同。具體來說:
  • utf8mb4_unicode_ci 校對規則按照 Unicode 字符進行排序,並且不區分大小寫和空格。它支持所有的 Unicode 字符,適合大多數的場景。
  • utf8mb4_bin 校對規則按照字符串的字節編碼進行排序,區分大小寫和空格。由於不會進行字符轉換,可能會導致排序結果錯誤,並且不支持 Unicode 字符的正確排序和比較。因此,它更適用於只關注字符編碼而不是字符本身的場景,如密碼等敏感信息的存儲。
總之,在選擇 MySQL 中的校對規則時,需要根據實際需求選擇合適的校對規則。在大多數情況下,應該優先選擇 utf8mb4_unicode_ci 校對規則。 那爲什麼選擇utf8mb4_bin呢 請參照下面的 “選擇 utf8mb4_bin 校對規則進行排序的場景”

示例:

在實際使用中,排序順序通常可以通過 ASCDESC 關鍵字來進行指定,其中 ASC 表示升序,DESC 表示降序。
以下是將 utf8mb4_unicode_ci 和 utf8mb4_bin 校對規則應用於上述例子,並按照升序和降序兩種方式進行排序的結果:
  • 使用 utf8mb4_unicode_ci 校對規則進行升序排序時:
  À
  à
  A
  Z
  • 使用 utf8mb4_unicode_ci 校對規則進行降序排序時:
  Z
  A
  à
  À
可以看到,在 utf8mb4_unicode_ci 校對規則下,無論是升序還是降序排序,'À' 和 'à' 的排序位置都是相同的,因爲該校對規則不區分大小寫和空格,而且會將一些特殊字符轉換成常規字符。
  • 對於 utf8mb4_bin 校對規則進行升序排序時:
  A
  Z
  à
  À
  • 對於 utf8mb4_bin 校對規則進行降序排序時:
  À
  à
  Z
  A
可以看到,在 utf8mb4_bin 校對規則下,'À' 和 'à' 的排序位置與 utf8mb4_unicode_ci 校對規則下的結果不同,這是因爲該校對規則區分大小寫和空格,並直接按照字符編碼進行排序,而不會轉換字符。
綜上所述,在 MySQL 中,排序順序可以通過 ASCDESC 來進行指定,並且不同的排序規則可能導致不同的排序結果。在選擇排序規則時,需要根據實際需求進行選擇,以確保查詢和排序的準確性。
 
 

2.6 選擇 utf8mb4_bin 校對規則進行排序的場景

通常有以下幾種:
  • 僅需要關注字符編碼而不是字符本身
utf8mb4_bin 校對規則會直接按照字符串的字節編碼進行比較和排序,不會進行任何字符轉換。因此,在某些情況下,如果只需要關注字符編碼而不是字符本身,就可以使用 utf8mb4_bin 校對規則進行排序。
例如,在存儲密碼等敏感信息時,爲了保證數據的安全性,通常會使用哈希函數對密碼進行加密,並將加密後的結果存儲在數據庫中。由於哈希值只包含字符編碼而不包含字符本身,因此可以使用 utf8mb4_bin 校對規則進行排序和比較。
  • 需要區分大小寫和空格
在某些情況下,可能需要區分大小寫和空格,以便更精確地進行查詢和排序。例如,在搜索功能中,用戶可能會輸入大小寫不同、帶空格或其他標點符號的關鍵字進行搜索。這時,可以使用 utf8mb4_bin 校對規則進行排序和比較,以確保精確匹配。
  • 性能要求高
由於 utf8mb4_bin 校對規則直接按照字節編碼進行排序,比 utf8mb4_unicode_ci 校對規則更加簡單高效,因此在某些性能要求較高的場景下,也可以考慮使用 utf8mb4_bin 校對規則進行排序。
總之,utf8mb4_bin 校對規則適用於僅關注字符編碼而不是字符本身、需要區分大小寫和空格或者對性能要求較高的場景下,但它也有一些侷限性,不能支持 Unicode 字符之間的正確排序和比較,因此在選擇校對規則時,需要根據實際需求進行選擇。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章