-
規則
[強制]所有數據表使用 utf8mb4 編碼,在創建數據庫時指明使用 utf8mb4,會被繼承。比較規則統一設置爲
utf8mb4 bin”,大小寫敏感。
-
規則的背後
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 校對規則進行排序的場景”
示例:
在實際使用中,排序順序通常可以通過 ASC
或 DESC
關鍵字來進行指定,其中 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 中,排序順序可以通過 ASC
或 DESC
來進行指定,並且不同的排序規則可能導致不同的排序結果。在選擇排序規則時,需要根據實際需求進行選擇,以確保查詢和排序的準確性。
2.6 選擇 utf8mb4_bin 校對規則進行排序的場景
通常有以下幾種:
utf8mb4_bin 校對規則會直接按照字符串的字節編碼進行比較和排序,不會進行任何字符轉換。因此,在某些情況下,如果只需要關注字符編碼而不是字符本身,就可以使用 utf8mb4_bin 校對規則進行排序。
例如,在存儲密碼等敏感信息時,爲了保證數據的安全性,通常會使用哈希函數對密碼進行加密,並將加密後的結果存儲在數據庫中。由於哈希值只包含字符編碼而不包含字符本身,因此可以使用 utf8mb4_bin 校對規則進行排序和比較。
在某些情況下,可能需要區分大小寫和空格,以便更精確地進行查詢和排序。例如,在搜索功能中,用戶可能會輸入大小寫不同、帶空格或其他標點符號的關鍵字進行搜索。這時,可以使用 utf8mb4_bin 校對規則進行排序和比較,以確保精確匹配。
由於 utf8mb4_bin 校對規則直接按照字節編碼進行排序,比 utf8mb4_unicode_ci 校對規則更加簡單高效,因此在某些性能要求較高的場景下,也可以考慮使用 utf8mb4_bin 校對規則進行排序。
總之,utf8mb4_bin 校對規則適用於僅關注字符編碼而不是字符本身、需要區分大小寫和空格或者對性能要求較高的場景下,但它也有一些侷限性,不能支持 Unicode 字符之間的正確排序和比較,因此在選擇校對規則時,需要根據實際需求進行選擇。