mysql 字符集
mysql支持使用不同的字符集存儲數據,支持四個級別的字符集設置:server、database、table 和 column。 MyISAM
, MEMORY
, and InnoDB
三個存儲引擎都支持不同的字符集設置。
本文參考:mysql 官網 http://www.mysql.com/
一、字符集和比對規則
字符集(character set):是一組符號和編碼
比對規則(collation):是一組字符比對的規則
舉例:
假設 A=0 , B=1 ,a=2, b=3。那麽其中A 就是一個符號,0就是一個編碼。 4個字母和他們編碼的總和被稱為字符集。
1.如果我們想要比較字符 A 和 B的大小,那麽我們使用他們的編碼 0 和 1 進行比較,得A<B。
這種比對規則 只包含了一種規則(編碼的比較),我們稱之為二進制比對規則。
2.如果我們不區分大小寫,那麽A 是=a的。
這種比對規則包含了兩種規則,1)大小寫字母相等。 2)比較編碼。我們稱之為大小寫敏感的比對規則
但是,在實際生活中,字符集都包含大量的字母和符號。比對規則也包含眾多的規則。
mysql可以做什麽呢?
1)使用不同的字符集來存儲字符。
2)使用不同的比對規則來進行字符的比較。
3)在同一臺服務器、數據庫甚至數據表中,混合使用不同的字符集。
二、mysql 中支持的字符集和比對規則
安裝好mysql server之後,可以通過兩種方式來查看其支持的character sets 和 collation。
1)查看系統表:INFOMATION_SCHEMA CHARACTER_SETS
2)使用命令:SHOW CHARACTER_SET (可跟 like where 條件表達式)
一套字符集可能會使用多種比對規則,查看方法如下:
1)查看系統表:INFOMATION_SCHEMA COLLATIONS
2)使用命令:SHOW COLLATION (可跟 like where 條件表達式)
三、在mysql中指定字符集和比對規則
Server character set 和 collation-server(服務器級別的字符集)
1.啟動服務時指定
Mysqld --character-set-server=latin1 --collation-server=latin1_swedish_ci
2.配置文件指定
[mysqld]
character-set-server=latin1
collation-server=latin1_swedish_ci
Database character set 和 collation (數據庫級別)
1.創建時
Create database db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
2.修改時
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
註:所有的database options 都保存在database文件的 db.opt 文本文件中
查看當前數據庫設置的字符集信息
USE db_name;
SELECT @@character_set_database, @@collation_database;
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = ‘db_name‘;
Table character set 和 collation (表級別)
同database level
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
]
Column character set 和 collation (列級別)
col_name
{CHAR | VARCHAR | TEXT} (col_length
)
[CHARACTER SET charset_name
]
[COLLATE collation_name
]
Examples:
CREATE TABLE t1
(
col1 VARCHAR(5)
CHARACTER SET latin1
COLLATE latin1_german1_ci
);
ALTER TABLE t1 MODIFY
col1 VARCHAR(5)
CHARACTER SET latin1
COLLATE latin1_swedish_ci;
字符串的 character 和 collation (普通字符串級別)
Select ‘string’ 使用的是character_set_connection 指定的字符集
字符 的 字符集指定語法
[_charset_name
]‘string
‘ [COLLATE collation_name
]
Examples:
SELECT ‘abc‘;
SELECT _latin1‘abc‘;
SELECT _binary‘abc‘;
SELECT _utf8‘abc‘ COLLATE utf8_danish_ci;
四、client-server 程序交互涉及到的字符集和比對規則
數據最終的存儲編碼
1.系統變量Character_set_server和 collation_server 設置服務器程序的字符集及比對順序
1.系統變量character_set_database和collation_database 標識了數據庫默認的字符集
Client 和 server 進行信息交互所使用的編碼
1.系統變量character_set_client標識了客戶端程序發送到服務端程序所使用的字符集
2.Server使用 character_set_connection 和collation_connection 標識的字符集來翻譯來自client的sql 命令
3.Character_set_results:server返回執行結果所使用的編碼
Client 程序所使用的字符編碼
註:默認使用OS上的默認編碼。若、mysql不支持OS默認編碼,則使用mysql默認編碼latin1
編碼修改方法:
1. client 啟動時,增加選項 --default-character-set=char-name
2. 配置文件my.ini中指定
[mysql]
Default-character-set=char-name
註:此時c-s交互編碼會自動被設置為 以上編碼
mysql 字符集