mysql字符集查看、修改utf8mb4


https://www.cnblogs.com/yangmingxianshen/p/7999428.html

https://blog.csdn.net/kikajack/article/details/84668924

https://www.cnblogs.com/amyzhu/p/9595665.html

一、查看字符集

1.查看MYSQL數據庫服務器和數據庫字符集

方法一:show variables like '%character%';
方法二:show variables like 'collation%';


mysql> show variables like '%character%'; +--------------------------+--------------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql5535/share/charsets/ | +--------------------------+--------------------------------------+ 8 rows in set (0.00 sec)

utf8mb4 已成為 MySQL 8.0 的默認字符集,在MySQL 8.0.1及更高版本中將 utf8mb4_0900_ai_ci 作為默認排序規則。
新項目只考慮 utf8mb4

UTF-8 編碼是一種變長的編碼機制,可以用1~4個字節存儲字符。

因為歷史遺留問題,MySQL 中的 utf8 編碼並不是真正的 UTF-8,而是閹割版的,最長只有3個字節。當遇到占4個字節的 UTF-8 編碼,例如 emoji 字符或者復雜的漢字,會導致存儲異常。

從 5.5.3 開始,MySQL 開始用 utf8mb4 編碼來實現完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4個字節。從 8.0 之后,將會在某個版本開始用 utf8mb4 作為默認字符編碼。
設置服務器默認字符集為 utf8mb4

創建數據庫時,如果沒有指定字符集,會采用服務器的默認字符集。設置服務器默認字符集為 utf8mb4 可以提高便利性。
編輯 MySQL 的配置文件

只需要關心5個系統變量,這5個都改為 utf8mb4 則修改成功:
character_set_client
character_set_connection
character_set_results
character_set_server
character_set_database

my.cnf 是MySQL 的配置文件,修改之前記得先備份:
在[mysqld]下面加上default-character-set=utf8后服務器啟動不了,莫名其妙。后來這么改就好了(MySQL5.7):

[mysqld]
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake
...
[client]
default-character-set=utf8mb4

重啟並確認

可以看到,系統編碼、連接編碼、服務器和客戶端編碼都設置為 UTF-8了:

mysql> show variables like "%char%";
+--------------------------------------+--------------------------------+
| Variable_name                        | Value                          |
+--------------------------------------+--------------------------------+
| character_set_client                 | utf8mb4                        |
| character_set_connection             | utf8mb4                        |
| character_set_database               | utf8mb4                        |
| character_set_filesystem             | binary                         |
| character_set_results                | utf8mb4                        |
| character_set_server                 | utf8mb4                        |
| character_set_system                 | utf8                           |
| character_sets_dir                   | /usr/share/mysql-8.0/charsets/ |
| validate_password.special_char_count | 1                              |
+--------------------------------------+--------------------------------+
9 rows in set (0.00 sec)

MySQL 中字符集相關變量

character_set_client:客戶端請求數據的字符集
character_set_connection:從客戶端接收到數據,然后傳輸的字符集
character_set_database:默認數據庫的字符集,無論默認數據庫如何改變,都是這個字符集;如果沒有默認數據庫,那就使用 character_set_server指定的字符集,這個變量建議由系統自己管理,不要人為定義。
character_set_filesystem:把操作系統上的文件名轉化成此字符集,即把 character_set_client轉換character_set_filesystem, 默認binary是不做任何轉換的
character_set_results:結果集的字符集
character_set_server:數據庫服務器的默認字符集
character_set_system:存儲系統元數據的字符集,總是 utf8,不需要設置
創建數據庫時指定字符集為 utf8mb4

如果數據庫默認字符集不是 utf8mb4,那么可以在創建數據庫時指定字符集:

CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;


排序字符集 collation

字符除了需要存儲,還需要排序或比較大小。推薦用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也沒啥問題。

MySQL 8.0 默認的是 utf8mb4_0900_ai_ci,屬於 utf8mb4_unicode_ci 中的一種,具體含義如下:

    uft8mb4 表示用 UTF-8 編碼方案,每個字符最多占4個字節。
    0900 指的是 Unicode 校對算法版本。(Unicode歸類算法是用於比較符合Unicode標准要求的兩個Unicode字符串的方法)。
    ai指的是口音不敏感。也就是說,排序時e,è,é,ê和ë之間沒有區別。
    ci表示不區分大小寫。也就是說,排序時p和P之間沒有區別。

utf8mb4 已成為默認字符集,在MySQL 8.0.1及更高版本中將utf8mb4_0900_ai_ci作為默認排序規則。以前,utf8mb4_general_ci是默認排序規則。由於utf8mb4_0900_ai_ci排序規則現在是默認排序規則,因此默認情況下新表格可以存儲基本多語言平面之外的字符。現在可以默認存儲表情符號。如果需要重音靈敏度和區分大小寫,則可以使用utf8mb4_0900_as_cs代替。

1.utf8與utf8mb4(utf8 most bytes 4)

  • MySQL 5.5.3之后增加了utfmb4字符編碼
  • 支持BMP(Basic Multilingual Plane,基本多文種平面)和補充字符
  • 最多使用四個字節存儲字符

utf8mb4是utf8的超集並完全兼容utf8,能夠用四個字節存儲更多的字符。

標准的UTF-8字符集編碼是可以使用1-4個字節去編碼21位字符,這幾乎包含了世界上所有能看見的語言。
MySQL里面實現的utf8最長使用3個字符,包含了大多數字符但並不是所有。例如emoji和一些不常用的漢字,如“墅”,這些需要四個字節才能編碼的就不支持。

2.字符集、連接字符集、排序字符集

utf8mb4對應的排序字符集有utf8mb4_unicode_ci、utf8mb4_general_ci.

utf8mb4_unicode_ci和utf8mb4_general_ci的對比:

  • 准確性:
    • utf8mb4_unicode_ci是基於標准的Unicode來排序和比較,能夠在各種語言之間精確排序
    • utf8mb4_general_ci沒有實現Unicode排序規則,在遇到某些特殊語言或者字符集,排序結果可能不一致。
    • 但是,在絕大多數情況下,這些特殊字符的順序並不需要那么精確。
  • 性能
    • utf8mb4_general_ci在比較和排序的時候更快
    • utf8mb4_unicode_ci在特殊情況下,Unicode排序規則為了能夠處理特殊字符的情況,實現了略微復雜的排序算法。
    • 但是在絕大多數情況下發,不會發生此類復雜比較。相比選擇哪一種collation,使用者更應該關心字符集與排序規則在db里需要統一。
 
 


免責聲明!

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



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