http://www.linux-centos.com/2013/08/06/mysql%E5%AD%97%E7%AC%A6%E9%9B%86/#mysql-3
Contents [hide]
常用字符集比较
字符集 | 是否定长 | 编码方式 | 说明 |
ASCII | 是 | 单字节7位编码 | 最早的奠基性字符集 |
ISO-8859-1/latin | 是 | 单字节8位编码 | 西欧字符集经常被用来转码 |
GB 2312-80 | 是 | 双字节编码 | 早期标准,不推荐再使用 |
GBK | 是 | 双字节编码 | 虽然不是国标,但支持的系统不少 |
GB 18030 | 否 | 2字节或4字节编码 | 开始有一些支持,但是数据库支持的还少见 |
UTF-32 | 是 | 4字节编码 | USC-4原始编码,目前较少采用 |
USC-2 | 是 | 2字节编码 | Windows2000内部用USC-2 |
UTF-16 | 否 | 2字节或4字节编码 | JAVA和windows xp/nt内部使用UTF-16 |
UTF-8 | 否 | 1~4字节编码 | 互联网和UNIX/LINUX广泛支持的UNICODE字符集;mysql server也使用UTF-8 |
如何选择合适的字符集
- 满足应用支持的语言要求,如果应用要处理各种各样的文字,或者将发布到使用不同语言的国家。就应该使用Unicode字符集。对mysql来说,现在就是UTF-8
- 应用中如果涉及到数据导入,就需要考虑数据库字符集对已有数据的兼容性。假如已有数据是GBK文字,如把需要导入的数据的字符集设置为GB 2313-80,就很可能出现某些文字无法正确导入。
- 如果数据库只需要支持一般中文,数据量很大,对性能要求较高,那就应该选择双字节定长编码的字符集,比如GBK。因为对于UTF-8而言,GBK比较小,每个汉字只占2个字节,而UTF-8汉字编码需要3个字节,这样可以减少磁盘IO、数据库cache,以及网络传输的时间,从而提高性能。相反,如果应用主要处理英文字符,仅有少量汉字数据,那应该选择UTF-8会更好,因为GBK、USC-2、UTF-16的西文字符编码都是两个字节,会造成不必要的开销
mysql的字符集简介
同一台服务器、同一个数据库甚至同一个表的不同字段都可以指定使用不同的字符集。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
# 查看所有字符集
mysql
>
show
character
set
;
+
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
+
|
Charset
|
Description
|
Default
collation
|
Maxlen
|
+
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
+
|
big5
|
Big5
Traditional
Chinese
|
big5_chinese_ci
|
2
|
|
dec8
|
DEC
West
European
|
dec8_swedish_ci
|
1
|
|
cp850
|
DOS
West
European
|
cp850_general_ci
|
1
|
|
hp8
|
HP
West
European
|
hp8_english_ci
|
1
|
|
koi8r
|
KOI8
-
R
Relcom
Russian
|
koi8r_general_ci
|
1
|
|
latin1
|
cp1252
West
European
|
latin1_swedish_ci
|
1
|
|
latin2
|
ISO
8859
-
2
Central
European
|
latin2_general_ci
|
1
|
|
swe7
|
7bit
Swedish
|
swe7_swedish_ci
|
1
|
|
ascii
|
US
ASCII
|
ascii_general_ci
|
1
|
|
ujis
|
EUC
-
JP
Japanese
|
ujis_japanese_ci
|
3
|
|
sjis
|
Shift
-
JIS
Japanese
|
sjis_japanese_ci
|
2
|
|
hebrew
|
ISO
8859
-
8
Hebrew
|
hebrew_general_ci
|
1
|
|
tis620
|
TIS620
Thai
|
tis620_thai_ci
|
1
|
|
euckr
|
EUC
-
KR
Korean
|
euckr_korean_ci
|
2
|
|
koi8u
|
KOI8
-
U
Ukrainian
|
koi8u_general_ci
|
1
|
|
gb2312
|
GB2312
Simplified
Chinese
|
gb2312_chinese_ci
|
2
|
|
greek
|
ISO
8859
-
7
Greek
|
greek_general_ci
|
1
|
|
cp1250
|
Windows
Central
European
|
cp1250_general_ci
|
1
|
|
gbk
|
GBK
Simplified
Chinese
|
gbk_chinese_ci
|
2
|
|
latin5
|
ISO
8859
-
9
Turkish
|
latin5_turkish_ci
|
1
|
|
armscii8
|
ARMSCII
-
8
Armenian
|
armscii8_general_ci
|
1
|
|
utf8
|
UTF
-
8
Unicode
|
utf8_general_ci
|
3
|
|
ucs2
|
UCS
-
2
Unicode
|
ucs2_general_ci
|
2
|
|
cp866
|
DOS
Russian
|
cp866_general_ci
|
1
|
|
keybcs2
|
DOS
Kamenicky
Czech
-
Slovak
|
keybcs2_general_ci
|
1
|
|
macce
|
Mac
Central
European
|
macce_general_ci
|
1
|
|
macroman
|
Mac
West
European
|
macroman_general_ci
|
1
|
|
cp852
|
DOS
Central
European
|
cp852_general_ci
|
1
|
|
latin7
|
ISO
8859
-
13
Baltic
|
latin7_general_ci
|
1
|
|
cp1251
|
Windows
Cyrillic
|
cp1251_general_ci
|
1
|
|
cp1256
|
Windows
Arabic
|
cp1256_general_ci
|
1
|
|
cp1257
|
Windows
Baltic
|
cp1257_general_ci
|
1
|
|
binary
|
Binary
pseudo
charset
|
binary
|
1
|
|
geostd8
|
GEOSTD8
Georgian
|
geostd8_general_ci
|
1
|
|
cp932
|
SJIS
for
Windows
Japanese
|
cp932_japanese_ci
|
2
|
|
eucjpms
|
UJIS
for
Windows
Japanese
|
eucjpms_japanese_ci
|
3
|
+
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
--
--
--
--
--
--
-
+
--
--
--
--
+
36
rows
in
set
(
0.00
sec
)
|
mysql的字符集包括字符集(CHARACTER)和校对规则(COLLATION)两个概念。字符集是用来定义MYSQL存储字符串的方式,校对规则是定义了比较字符串的方式。
每个字符集至少对应一个校对规则。可用show collcation命令查看
1
2
3
4
5
6
7
8
9
|
# 可以看到,对于gbk字符集来说,gbk_chinese_ci是默认的校对规则,大小写不敏感,而gbk_bin是按照编码的值进行比较,是大小写敏感的
mysql
>
show
collation
like
'%gbk%'
;
+
--
--
--
--
--
--
--
--
+
--
--
--
--
-
+
--
--
+
--
--
--
--
-
+
--
--
--
--
--
+
--
--
--
--
-
+
|
Collation
|
Charset
|
Id
|
Default
|
Compiled
|
Sortlen
|
+
--
--
--
--
--
--
--
--
+
--
--
--
--
-
+
--
--
+
--
--
--
--
-
+
--
--
--
--
--
+
--
--
--
--
-
+
|
gbk_chinese_ci
|
gbk
|
28
|
Yes
|
Yes
|
1
|
|
gbk_bin
|
gbk
|
87
|
|
Yes
|
1
|
+
--
--
--
--
--
--
--
--
+
--
--
--
--
-
+
--
--
+
--
--
--
--
-
+
--
--
--
--
--
+
--
--
--
--
-
+
2
rows
in
set
(
0.00
sec
)
|
校对规则命名约定:他们以其相关的字符集名开始,通常包括一个语言名,并且以ci(大小写不敏感),_cs(大小写敏感)或_bin(二元,即比较是基于字符编码的值而与language无关)结束。
mysql字符集的设置
mysql字符集和校对规则支持四个级别的默认设置:服务器级、数据库级、表级和字段级。他们分别在不同的地方设置,作用也不相同。
服务器级字符集和校对规则
1
2
3
4
5
6
7
8
9
|
# 可以在my.cnf中设置
[
mysqld
]
default
-
character
-
set
=
gbk
# 或者再启动选项中指定
msyqld
--
default
-
character
-
set
=
gbk
# 或者在编译的时候指定
.
/
configure
--
with
-
charset
=
gbk
|
如果没有指定服务器字符集,默认会使用latin1作为服务器字符集。上面三种方式只是指定了字符集,没有指定校对规则,所以会使用该字符集的默认校对规则,如果要使用该字符集的非默认校对规则,需要在指定字符集的同时指定校对规则。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 查询当前服务器的字符集和校对规则
mysql
>
show
variables
like
'character_set_server'
;
ERROR
2006
(
HY000
)
:
MySQL
server
has
gone
away
No
connection
.
Trying
to
reconnect
.
.
.
Connection
id
:
110
Current
database
:
*
*
*
NONE *
*
*
+
--
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
+
|
Variable_name
|
Value
|
+
--
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
+
|
character_set_server
|
latin1
|
+
--
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
+
1
row
in
set
(
0.00
sec
)
|
数据库字符集和校对规则
需要注意,如果数据库里已经存在数据,因为修改字符集不能将已有的数据按照新的字符集进行存放,所以不能通过直接修改数据库的字符集直接修改数据内容。所以在创建数据库的时候最好明确指定字符集和校对规则,避免收到默认值的影响。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 显示当前数据库的字符集和默认规则
mysql
>
use
test
Database
changed
mysql
>
show
variables
like
'character_set_database'
;
+
--
--
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
+
|
Variable_name
|
Value
|
+
--
--
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
+
|
character_set_database
|
latin1
|
+
--
--
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
+
1
row
in
set
(
0.00
sec
)
mysql
>
show
variables
like
'collation_database'
;
+
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
-
+
|
Variable_name
|
Value
|
+
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
-
+
|
collation_database
|
latin1_swedish_ci
|
+
--
--
--
--
--
--
--
--
--
--
+
--
--
--
--
--
--
--
--
--
-
+
1
row
in
set
(
0.00
sec
)
|
表字符集和校对规则
同样,如果表中已有数据,修改字符集对原有记录并没有影响,不会按照新的字符集进行存放。表的字段仍然使用原来的字符集。所以最好在创建表的时候也指定好字符集和校对规则。
1
2
3
4
5
6
7
8
9
|
# 显示表的字符集和校对规则
mysql
>
show
create
table
test
\
G
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
1.
row *
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
Table
:
test
Create
Table
:
CREATE
TABLE
`
test
`
(
`
c1
`
float
(
10
,
2
)
DEFAULT
NULL
,
`
c2
`
decimal
(
10
,
2
)
DEFAULT
NULL
)
ENGINE
=
MyISAM
DEFAULT
CHARSET
=
latin1
1
row
in
set
(
0.00
sec
)
|