字符集
-- 查詢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)
- character_set_client 客戶端數據使用的字符集 MySQL Client發送給mysqld的語句或數據使用字符集。
- character_set_connection 連接層字符集 其實很多人對這個字符集一臉懵逼,這個字符集與character_set_client有啥區別呢? 這個字符集用於沒有introducer修飾的字符串和數字到字符串的轉換。 由introducer修飾的文本字符串在請求過程中不經過多餘的轉碼,直接轉換爲內部字符集處理。
- character_set_database 數據庫字符集 MySQL可以給實例下不同數據庫單獨設置各自的字符集。這個跟SQL Server是類似的。
- character_set_filesystem 文件系統字符集 該變量用於解釋引用文件名的字符串文字,例如在LOAD DATA INFILE和SELECT ... INTO OUTFILE語句和LOAD_FILE()函數中。 在文件打開嘗試發生之前,這樣的文件名將從character_set_client轉換爲character_set_filesystem。 默認值爲二進制,這意味着不會發生轉換。 對於允許多字節文件名的系統,不同的值可能更合適。例如,如果系統使用UTF-8表示文件名,則將character_set_filesystem設置爲“utf8”。
- character_set_results 查詢結果字符集 mysqld 在返回查詢結果集或者錯誤信息到客戶端時,使用的編碼字符集
- character_set_server 服務器字符集,默認的字符集 服務器級別(實例級別) 的字符集。如果創建數據庫時,不指定字符集,那麼就會默認使用服務器的編碼字符集。
- character_set_system 系統元數據字符集 它是系統元數據((表|字段)名等)存儲時使用的編碼字符集,該字段和具體存儲的數據無關。總是固定不變的UTF8字符集。
- 另外,之前的版本還有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)
查詢表的字符集
-
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 -
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) show create table sys_user;
-
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)
修改字符集
- 修改字段
ALTER TABLE table_name MODIFY cloumn_name VARCHAR(50) CHARACTER SET utf8mb4 ;
- 修改系統變量 (當前環境生效,見3注意)
set character_set_database=utf8mb4; set global character_set_database=utf8mb4;
-
修改mysql 服務器字符集
set global character_set_server=utf8mb4;
注意,上述命令只對當前環境生效,如果沒有在my.cnf設置系統變量character_set_server,那麼MySQL服務重啓後,就會失效。所以一般在my.cnf配置文件設置系統變量character_set_server。對於系統變量character_set_database也是如此。
-
修改客戶端字符集
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 |