MySQL設置字符集、排序規則和區分字母大小


摘要:在MySQL中,設置字符集和排序規則,在查詢時區分字母大小寫,utf8mb4支持emoji表情,而utf8不支持。

問題綜述

  在工作中,設置的一些唯一標志字符串和登錄密碼都是區分大小寫的,但是,在從MySQL數據庫查詢的時候,卻遇到了不區分英文字母大小寫的尷尬糗事,好不驚訝!趕快科普一番,發現MySQL區分大小寫取決於數據庫的排序規則(collation),今天在這里總結一下。

  在MySQL中,字符集和排序規則是區分開來的,你需要單獨設置字符集和排序規則。當然MySQL字符集和排序規則也是相關聯的。除非特殊需求,只要設置其一即可,例如,設置字符集,即設置了默認的排序規則。一般創建數據庫都推薦使用 utf8mb4 字符集,下面列出UTF8和utf8mb4的排序規則:

MySQL UTF8 常用字符排序規則

排序規則 描述
utf8_general_ci 不區分大小寫,默認排序規則
utf8_general_cs 區分大小寫
utf8_bin 區分大小寫,字符串每個字符串用二進制數據編譯存儲,且支持存儲二進制數據

MySQL utf8mb4 常用字符排序規則

排序規則 描述
utf8mb4_bin 區分大小寫,將字符串每個字符用二進制數據編譯存儲,區分e和é這類字符
utf8mb4_general_ci ci即case insensitive,不區分大小寫,不區分e和é這類字符,默認排序規則
utf8mb4_unicode_ci 不區分大小寫,能夠在各種語言之間精確排序,不區分e和é這類字符
utf8mb4_general_cs 區分大小寫,不區分e和é這類字符

utf8mb4 和 utf8的區別

  官方對utf8mb4 和 utf8的定義如下:

  • utf8mb4: A UTF-8 encoding of the Unicode character set using one to four bytes per character.

  • utf8mb3: A UTF-8 encoding of the Unicode character set using one to three bytes per character.

  • utf8: An alias for utf8mb3.

Note
The utf8mb3 character set is deprecated and you should expect it to be removed in a future MySQL release. Please use utf8mb4 instead. utf8 is currently an alias for utf8mb3, but it is now deprecated as such, and utf8 is expected subsequently to become a reference to utf8mb4. Beginning with MySQL 8.0.28, utf8mb3 is also displayed in place of utf8 in columns of Information Schema tables, and in the output of SQL SHOW statements.
To avoid ambiguity about the meaning of utf8, consider specifying utf8mb4 explicitly for character set references.

  如上英文簡單概括如下:
(1)utf8mb4 是真正的 UTF-8。
(2)utf8 是一種專屬的編碼,它能夠編碼的 Unicode 字符並不多。
(3)預計uft8將指代utf8mb4。

  由此可見,推薦使用字符集utf8mb4指定字符集,而非使用模棱兩可的utf8。另外,utf8mb4支持emoji表情,而utf8不支持

問題復現

  如下兩個查詢條件在根據用戶密碼查詢user表的數據時,結果一致,即不區分字母大小寫:

SELECT * FROM `user` WHERE password = 'M.77720';
SELECT * FROM `user` WHERE password = 'm.77720';

問題分析

  執行show full columns命令查看表結構,發現結果集中 collation 屬性存在 utf8_general_ci,腳本和結果集截圖如下所示:

show full COLUMNS FROM user;

查看排序規則

還可以使用如下命令查看表的排序規則:

show table status from schema_name like '%table_name%';

  此命令支持表名模糊匹配。一般MySQL建schema和table的強制規范如下:

  • 創建schema時務必顯式指定字符集,而且字符集只能是utf8mb4;
  • 表的字符集建議使用utf8mb4;
  • 表的排序規則需要區分大小寫。

  故由截圖可知,我們創建的表結構,使用了錯誤的字符集和錯誤的排序規則,需要同時改掉。也可以使用如下命令查看表的字符集:

SHOW CREATE TABLE table_name;

binary 臨時解決方案

  我們用binary關鍵字來強制區分字母大小寫,改寫SQL腳本如下:

SELECT * FROM `user` WHERE binary password = 'M.77720';
SELECT * FROM `user` WHERE binary password = 'm.77720';

  則執行如上查詢腳本后,可以看到結果集不一致,故問題成功解決。瑕疵是這是一種治標不治本的策略。

MySQL修改表的字符集和修改字段的字符集

請移步《MySQL修改表和字段的字符集和排序規則》。

結束語

  MySQL創建schema和table的時候,請設置字符集為uftmb8,排序規則請指定為utf8mb4_bin,以在查詢時區分字母大小寫,插入時支持emoji等特殊字符😁。

  歡迎點贊閱讀,一同學習交流;若有疑問,請在文章下方留下你的神評妙論!以促使博文💯高質量。

Reference


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM