MySQL字符集简介:
字符集是很重要的内容,由于开发人员对字符集的不重视,有可能导致软件后期有这样或那样的问题产生;
在MySQL数据库中,默认的字符集是latin1,对于国外的以英语为母语的人来说,这个字符集一般不会出现太多问题,但对于中文而言,就有太多的问题;
通过SHOW CHARSET可以查看MySQL支持的字符集,MySQL5.5这个版本是39个字符集;
对于简体中文,我们一般用gbk或gb2312,二者的区别是:gbk是gb2312的超集,因此可以支持更多的汉字;但由于MySQL5.5不支持gb18030,因此在有些应用中已经出现gbk不能显示特定中文字体的情况了;而对于繁体中文,big5可能是首选;
对于Unicode和utf8:
Unicode是一种在计算机上使用的字符编码,它为每种语言中的每个字符设定了统一且唯一的二进制编码,需要注意的是,Unicode是字符编码,不是字符集。
Unicode是国际组织指定的可以容纳世界上所有文字和符号的字符编码方案,用数字0到0x10FFFF来映射这些字符,即最多可以容纳1114112个字符。
我们可以通过一下SQL语句来查询MySQL支持的Unicode编码的字符集;
mysql> USE information_schema;
Database changed
mysql> SELECT * FROM CHARACTER_SETS
-> WHERE DESCRIPTION like '%Unicode';
+--------------------+----------------------+----------------+--------+
| CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION | MAXLEN |
+--------------------+----------------------+----------------+--------+
| utf8 | utf8_general_ci | UTF-8 Unicode | 3 |
| ucs2 | ucs2_general_ci | UCS-2 Unicode | 2 |
| utf8mb4 | utf8mb4_general_ci | UTF-8 Unicode | 4 |
| utf16 | utf16_general_ci | UTF-16 Unicode | 4 |
| utf32 | utf32_general_ci | UTF-32 Unicode | 4 |
+--------------------+----------------------+----------------+--------+
5 rows in set (0.00 sec)
MySQL5.5数据库共支持5种Unicode编码,utf8被视为utf8mb3,即最大占用3个字节空间,而utf8mb4可以视做utf8mb3的扩展,对BMP(Basic Multilingual Plane)字符的存储,utf8mb3和utf8mb4两者是完全一样的,区别只是utf8mb4对扩展字符的支持;
要查看当前使用的字符集,可以使用STATUS命令:
mysql> STATUS;
--------------
mysql Ver 14.14 Distrib 5.5.35, for Win32 (x86)
Connection id: 1
Current database: information_schema
Current user: root@localhost
SSL: Not in use
Using delimiter: ;
Server version: 5.5.35 MySQL Community Server (GPL)
Protocol version: 10
Connection: localhost via TCP/IP
Server characterset: gbk
Db characterset: utf8
Client characterset: gbk
Conn. characterset: gbk
TCP port: 3306
Uptime: 57 min 1 sec
Threads: 4 Questions: 61 Slow queries: 0 Opens: 37 Flush tables: 1 Open tab
les: 0 Queries per second avg: 0.017
--------------
命令 SET NAMES 可以用来更改当前会话连接的字符集、当前会话的客户端的字符集以及当前会话返回结果集的字符集;
mysql> SET NAMES 'gbk';
MySQL数据库另一个比较厉害的地方是,可以细化每个对象字符集的设置,如:
mysql> CREATE TABLE t (
-> a VARCHAR(10) CHARSET gbk,
-> b VARCHAR(10) CHARSET latin1,
-> c VARCHAR(10)
-> ) CHARSET=utf8;
Query OK, 0 rows affected (0.09 sec)
注:SQL标准支持NCHAR类型(National Character Set),在MySQL5.5数据库中用utf8来表示这种类型,如:
mysql> CREATE TABLE t (
-> a NCHAR(10)
-> ) CHARSET=gbk;
Query OK, 0 rows affected (0.06 sec)
mysql> SHOW CREATE TABLE t\G;
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`a` char(10) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
我们在客户端可以使用N前缀将字符串指定为NCHAR类型,也就是UTF-8,如:
SELECT N'小明';