共計 5613 個字符,預計需要花費 15 分鐘才能閱讀完成。
這期內容當中丸趣 TV 小編將會給大家帶來有關 MySQL 數據庫字符集有哪些,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、字符集、字符序的概念與聯系
在數據的存儲上,MySQL 提供了不同的字符集支持。而在數據的對比操作上,則提供了不同的字符序支持。MySQL 提供了不同級別的設置,包括 server 級、database 級、table 級、column 級,可以提供非常精準的設置。
什么是字符集、字符序? 簡單的來說:
字符集 (character set):定義了字符以及字符的編碼。
字符序 (collation):定義了字符的比較規則。
舉個例子:
有四個字符:A、B、a、b,這四個字符的編碼分別是 A = 0, B = 1, a = 2, b = 3。這里的字符 + 編碼就構成了字符集 (character set)。
二、MySQL 支持的字符集、字符序
MySQL 支持多種字符集 與 字符序。
一個字符集對應至少一種字符序 (一般是 1 對多)。
兩個不同的字符集不能有相同的字符序。
每個字符集都有默認的字符序。
1. 查看支持的字符集
可以通過以下方式查看 MYSQL 支持的字符集。
SHOW CHARACTER SET; select * from information_schema.HARACTER_SETS;
2. 查看支持的字符序
可以通過如下方式查看 MYSQL 支持的字符序。
SHOW COLLATION WHERE Charset = utf8 SELECT * FROM information_schema.COLLATIONS WHERE CHARACTER_SET_NAME= utf8
三、系統的字符集 (character_set_system)
character_set_system 為元數據的字符集,即所有的元數據都使用同一個字符集。試想如果元數據采用不同字符集,INFORMATION_SCHEMA 中的相關信息在不同行之間就很難展示。同時該字符集要能夠支持多種語言,方便不同語言人群使用自己的語言命名 database、table、column。MySQL 選擇 UTF- 8 作為元數據編碼,用源碼固定。
查看 system 字符集:
select @@global.character_set_system;
因為很少設定,所以就不做指定介紹了。
四、server 的字符集、字符序 (character_set_server/collation_server)
當 create database 沒有指定 charset/collation 就會用 character_set_server/collation_server,這兩個變量可以動態設置,有 session/global 級別。
在源碼中 character_set_server/collation_server 實際對應一個變量,因為一個 collation 對應著一個 charset,所以源碼中只記錄 CHARSET_INFO 結構的 collation_server 即可。當修改 character_set_server,會選擇對應 charset 的默認 collation。對于其他同時有 charset 和 collation 的變量,源碼記錄也都是記錄 collation。
character_set_server、collation_server 分別對應 server 字符集、server 字符序。
1. 查看 server 字符集、字符序
分別對應 character_set_server、collation_server 兩個系統變量。
SET GLOBAL SHOW_COMPATIBILITY_56=ON; SHOW VARIABLES LIKE character_set_server SHOW VARIABLES LIKE collation_server
2. 啟動服務時指定
可以在 MySQL 服務啟動時,指定 server 字符集、字符序。如不指定,默認的字符序分別為 latin1、latin1_swedish_ci
mysqld --character-set-server=latin1 --collation-server=latin1_swedish_ci
3. 配置文件指定
除了在命令行參數里指定,也可以在配置文件里指定,如下所示。
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] collation-server = utf8_unicode_ci init-connect= SET NAMES utf8 character-set-server = utf8
4. 運行時修改
例子:運行時修改 (重啟后會失效,如果想要重啟后保持不變,需要寫進配置文件里)
mysql SET character_set_server = utf8 ;
5. 編譯時指定默認字符集、字符序
character_set_server、collation_server 的默認值,可以在 MySQL 編譯時,通過編譯選項指定:
cmake . -DDEFAULT_CHARSET=latin1 -DDEFAULT_COLLATION=latin1_german1_ci
6. 實例
通過設置 session 中不同的 character_set_server 使創建 database 的默認 charset 和 collation 不同。
set character_set_server= utf8 create database d1; select * from information_schema.schemata where SCHEMA_NAME= d1 set character_set_server= latin1 create database d2; select * from SCHEMATA where SCHEMA_NAME= d2
五、database 的字符集、字符序 (character_set_database/collation_database)
指定數據庫級別的字符集、字符序。同一個 MySQL 服務下的數據庫,可以分別指定不同的字符集 / 字符序。該變量值 session 級別表示當前 database 的 charset/collation,在后面的源碼版本中該變量可能修正為只讀,不建議修改該值。其 global 級別變量后面也會移除。
1. 設置數據的字符集 / 字符序
可以在創建、修改數據庫的時候,通過 CHARACTER SET、COLLATE 指定數據庫的字符集、排序規則。
- 創建數據庫:
CREATE DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
修改數據庫:
ALTER DATABASE db_name [[DEFAULT] CHARACTER SET charset_name] [[DEFAULT] COLLATE collation_name]
例子:創建數據庫 test_schema,字符集設置為 utf8,此時默認的排序規則為 utf8_general_ci。
CREATE DATABASE `test_schema` DEFAULT CHARACTER SET utf8;
2. 查看數據庫的字符集 / 字符序
有 3 種方式可以查看數據庫的字符集 / 字符序。
查看 test_schema 的字符集、排序規則。(需要切換默認數據庫):
mysql use test_schema; mysql SELECT @@character_set_database, @@collation_database;
查看 test_schema 的字符集、數據庫 (不需要切換默認數據庫):
mysql SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name= test_schema
查看創建數據庫的語句,來查看字符集:
mysql SHOW CREATE DATABASE test_schema;
六、table 的字符集、字符序
創建表、修改表的語法如下,可通過 CHARACTER SET、COLLATE 設置字符集、字符序。
CREATE TABLE tbl_name (column_list) [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]] ALTER TABLE tbl_name [[DEFAULT] CHARACTER SET charset_name] [COLLATE collation_name]
1. 創建 table 并指定字符集 / 字符序
指定字符集為 utf8,字符序則采用默認的。
CREATE TABLE `test_schema`.`test_table` ( `id` INT NOT NULL COMMENT , PRIMARY KEY (`id`) COMMENT ) DEFAULT CHARACTER SET = utf8;
2. 查看 table 的字符集 / 字符序
同樣,有 3 種方式可以查看 table 的字符集 / 字符序。
方式一:通過 SHOW TABLE STATUS 查看 table 狀態,注意 Collation 為 utf8_general_ci,對應的字符集為 utf8。
SHOW TABLE STATUS FROM test_schema \G;
方式二:查看 information_schema.TABLES 的信息。
USE test_schema; SELECT TABLE_COLLATION FROM information_schema.TABLES WHERE
方式三:通過 SHOW CREATE TABLE 確認。
SHOW CREATE TABLE test_table;
3. table 字符集、字符序如何確定
假設 CHARACTER SET、COLLATE 的值分別是 charset_name、collation_name。如果創建 table 時:
明確了 charset_name、collation_name,則采用 charset_name、collation_name。
只明確了 charset_name,但 collation_name 未明確,則字符集采用 charset_name,字符序采用 charset_name 對應的默認字符序。
只明確了 collation_name,但 charset_name 未明確,則字符序采用 collation_name,字符集采用 collation_name 關聯的字符集。
charset_name、collation_name 均未明確,則采用數據庫的字符集、字符序設置。
七、column 的字符集、排序
類型為 CHAR、VARCHAR、TEXT 的列,可以指定字符集 / 字符序,語法如下:
col_name {CHAR | VARCHAR | TEXT} (col_length) [CHARACTER SET charset_name] [COLLATE collation_name]
1. 新增 column 并指定字符集 / 排序規則
例子如下:(創建 table 類似)
mysql ALTER TABLE test_table ADD COLUMN char_column VARCHAR(25) CHARACTER SET utf8;
2. 查看 column 的字符集 / 字符序
mysql SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA= test_schema AND TABLE_NAME= test_table AND COLUMN_NAME= char_column +--------------------+-----------------+ | CHARACTER_SET_NAME | COLLATION_NAME | +--------------------+-----------------+ | utf8 | utf8_general_ci | +--------------------+-----------------+ 1 row in set (0.00 sec)
3. column 字符集 / 排序規則確定
假設 CHARACTER SET、COLLATE 的值分別是 charset_name、collation_name:
如果 charset_name、collation_name 均明確,則字符集、字符序以 charset_name、collation_name 為準。
只明確了 charset_name,collation_name 未明確,則字符集為 charset_name,字符序為 charset_name 的默認字符序。
只明確了 collation_name,charset_name 未明確,則字符序為 collation_name,字符集為 collation_name 關聯的字符集。
charset_name、collation_name 均未明確,則以 table 的字符集、字符序為準。
上述就是丸趣 TV 小編為大家分享的 MySQL 數據庫字符集有哪些了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注丸趣 TV 行業資訊頻道。