mysql 字符集 排序規則

字符集

-- 查詢mysql 字符集相關的系統變量
show variables like 'character_set%';
+--------------------------+--------------------------------------------------------+
| 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       | D:\phpstudy_pro\Extensions\MySQL8.0.12\share\charsets\ |
+--------------------------+--------------------------------------------------------+
8 rows in set, 1 warning (0.03 sec)

 




  1. character_set_client  客戶端數據使用的字符集                                                                                                                          MySQL Client發送給mysqld的語句或數據使用字符集。
  2. character_set_connection   連接層字符集                                                                                                                                  其實很多人對這個字符集一臉懵逼,這個字符集與character_set_client有啥區別呢?                                                                  這個字符集用於沒有introducer修飾的字符串和數字到字符串的轉換。                                                                                        由introducer修飾的文本字符串在請求過程中不經過多餘的轉碼,直接轉換爲內部字符集處理。
  3. character_set_database     數據庫字符集                                                                                                                                  MySQL可以給實例下不同數據庫單獨設置各自的字符集。這個跟SQL Server是類似的。
  4. character_set_filesystem 文件系統字符集                                                                                                                                該變量用於解釋引用文件名的字符串文字,例如在LOAD DATA INFILE和SELECT ... INTO OUTFILE語句和LOAD_FILE()函數中。 在文件打開嘗試發生之前,這樣的文件名將從character_set_client轉換爲character_set_filesystem。 默認值爲二進制,這意味着不會發生轉換。 對於允許多字節文件名的系統,不同的值可能更合適。例如,如果系統使用UTF-8表示文件名,則將character_set_filesystem設置爲“utf8”。
  5. character_set_results      查詢結果字符集                                                                                                                                 mysqld 在返回查詢結果集或者錯誤信息到客戶端時,使用的編碼字符集
  6. character_set_server       服務器字符集,默認的字符集                                                                                                             服務器級別(實例級別) 的字符集。如果創建數據庫時,不指定字符集,那麼就會默認使用服務器的編碼字符集。
  7. character_set_system       系統元數據字符集                                                                                                                            它是系統元數據((表|字段)名等)存儲時使用的編碼字符集,該字段和具體存儲的數據無關。總是固定不變的UTF8字符集。
  8. 另外,之前的版本還有default-character-set,MySQL 5.5版本開始,移除了參數default_character_set 取而代之的是參數        character_set_server。character_set_client、character_set_connection、character_set_results這3個參數值是由客戶端每次連接進來設置的,和服務器端沒關係。MySQL會存在不同字符集的轉換過程。

查詢指定字符集   (默認查的是當前數據庫的字符集)

show variables like 'character_set_results';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| character_set_results | utf8  |
+-----------------------+-------+
1 row in set, 1 warning (0.00 sec)

查詢指定數據庫的字符集

show create database mysql;
+----------+----------------------------------------------------------------+
| Database | Create Database                                                |
+----------+----------------------------------------------------------------+
| mysql    | CREATE DATABASE `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------------+
1 row in set (0.00 sec)

查詢所有數據庫的字符集和排序規則

SELECT SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME  FROM INFORMATION_SCHEMA.SCHEMATA ;
+--------------------+----------------------------+------------------------+
| SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+--------------------+----------------------------+------------------------+
| mysql              | utf8                       | utf8_general_ci        |
| information_schema | utf8                       | utf8_general_ci        |
| performance_schema | utf8mb4                    | utf8mb4_0900_ai_ci     |
| sys                | utf8mb4                    | utf8mb4_0900_ai_ci     |
| sys_demo           | utf8mb4                    | utf8mb4_general_ci     |
+--------------------+----------------------------+------------------------+
5 rows in set (0.00 sec)

查詢表的字符集

  1. show create table sys_user;  
    -- (當前數據庫)
     Table     Create Table  
    sys_user CREATE TABLE `sys_user` (
      `id` bigint(20) NOT NULL,
      `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
      `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
      `test_char` char(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=COMPACT
  2. SELECT TABLE_SCHEMA, TABLE_NAME,TABLE_COLLATION FROM INFORMATION_SCHEMA.TABLES
        where TABLE_SCHEMA='sys_demo' and TABLE_NAME='sys_user' ;
    +--------------+------------+--------------------+
    | TABLE_SCHEMA | TABLE_NAME | TABLE_COLLATION    |
    +--------------+------------+--------------------+
    | sys_demo     | sys_user   | utf8mb4_general_ci |
    +--------------+------------+--------------------+
    1 row in set (0.00 sec)

查詢表中字段的字符集

  1.  同上查詢表的字符集(1)  show create table sys_user;  
  2. show full columns from sys_user;
    +-----------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
    | Field     | Type         | Collation          | Null | Key | Default | Extra | Privileges                      | Comment |
    +-----------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
    | id        | bigint(20)   | NULL               | NO   | PRI | NULL    |       | select,insert,update,references |         |
    | username  | varchar(255) | utf8mb4_general_ci | YES  |     | NULL    |       | select,insert,update,references |         |
    | password  | varchar(255) | utf8mb4_general_ci | YES  |     | NULL    |       | select,insert,update,references |         |
    | test_char | char(255)    | utf8mb4_general_ci | YES  |     | NULL    |       | select,insert,update,references |         |
    +-----------+--------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
    4 rows in set (0.00 sec)

修改字符集

  1. 修改字段
    ALTER TABLE table_name MODIFY cloumn_name VARCHAR(50) CHARACTER SET utf8mb4 ;   
  2. 修改系統變量 (當前環境生效,見3注意)
    set character_set_database=utf8mb4;
    set global character_set_database=utf8mb4;
  3. 修改mysql 服務器字符集

    set global character_set_server=utf8mb4;

    注意,上述命令只對當前環境生效,如果沒有在my.cnf設置系統變量character_set_server,那麼MySQL服務重啓後,就會失效。所以一般在my.cnf配置文件設置系統變量character_set_server。對於系統變量character_set_database也是如此。

  4. 修改客戶端字符集

    set names 'charset_name' [collate 'collation_name']
    -- 等同於同時設置下面三個
    set character_set_client = utf8;
    set character_set_results = utf8;
    set character_set_connection = utf8;

爲什麼不用utf8 字符集的選擇一般選utf8mb4 不選utf8 因爲mysql的utf8不是真正的utf8,比如不支持emoji表情 

排序字符集 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,è,é,ê和ë之間沒有區別。                                                                                        as指的是口音敏感。
ci結尾表示大小寫不敏感(caseinsensitive)。也就是說,排序時p和P之間沒有區別。                                                                    cs表示大小寫敏感(case sensitive)
如果需要區分大小寫和口音,則可以使用as_cs

uft8mb4_general_ci 不區分大小寫,這個你在註冊用戶名和郵箱的時候就要使用。
utf8mb4_general_cs 區分大小寫,如果用戶名和郵箱用這個 就會造成不良後果  

utf8mb4_XX_0900_as_cs   xx 表示國家或地區

語言  編碼
克羅地亞  utf8mb4_hr_0900_ai_ci 
捷克  utf8mb4_cs_0900_ai_ci 
丹麥  utf8mb4_da_0900_ai_ci 
世界語  utf8mb4_eo_0900_ai_ci 
愛沙尼亞語  utf8mb4_et_0900_ai_ci 
德國  utf8mb4_de_pb_0900_ai_ci 
匈牙利  utf8mb4_hu_0900_ai_ci 
冰島的  utf8mb4_is_0900_ai_ci 
拉脫維亞  utf8mb4_lv_0900_ai_ci 
立陶宛  utf8mb4_lt_0900_ai_ci 
拋光  utf8mb4_pl_0900_ai_ci 
古典拉丁文  utf8mb4_la_0900_ai_ci 
羅馬尼亞  utf8mb4_ro_0900_ai_ci 
斯洛伐克  utf8mb4_sk_0900_ai_ci 
斯洛文尼亞  utf8mb4_sl_0900_ai_ci 
現代西班牙  utf8mb4_es_0900_ai_ci 
傳統西班牙  utf8mb4_es_trad_0900_ai_ci 
瑞典  utf8mb4_sv_0900_ai_ci 
土耳其  utf8mb4_tr_0900_ai_ci 
越南  utf8mb4_vi_0900_ai_ci
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章