文章目录
一、遇到乱码问题
有时候在 mysql select 的时候,会遇到中文乱码的情况,如下:
MySQL> select * from testtb ;
+----+--------------+---------------+
| id | label |
+----+--------------+---------------+
| 18 | ?????x |
| 19 | ??????x |
| 24 | ?????r?x |
| 25 | ?a?th |
| 26 | ?s?e? |
| 31 |??ip??? |
| 32 | ?user?? |
| 47 | ??x???????? |
+----+---------------+--------------+
8 rows in set (0.03 sec)
二、查看当前编码
这时候查看 character_set
,如下:
MySQL > show VARIABLES like 'character_set_%';
+--------------------------+-----------------------------------------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/mysql/share/charsets/ |
+--------------------------+-----------------------------------------------------------------------------------------------+
8 rows in set (0.03 sec)
查 Mysql 编码的时候,看到 collation
这个东西 :
MySQL > show VARIABLES like 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-------------------+
3 rows in set (0.03 sec)
这里有两个疑惑:
1、既然 character set
表示编码, 那 collation
又是干啥用的呢?
2、这几对变量又有啥区别?
collation_connection 和 character_set_connection
collation_database 和 character_set_database
collation_server 和 character_set_server
三、理解 character set 和 collation
character set :
是对 Unicode 的一套编码,例如 utf8、gb2312等;
相当于通过不同的编码来描述 Unicode 。
collation:
比对方法;用于指定 数据集如何排序以及字符串的比对规则。
那么 character set 与 collation 具体是什么关系呢?
软件国际化是大势所趋, 所以 unicode 是国际化最佳的选择;
mysql 有两个支持 unicode 的 character set:
ucs2: 使用 16 bits 来表示一个 unicode 字符。
utf8: 使用 1~3 bytes 来表示一个 unicode 字符。
为了提高性能,有些情况下还是使用 latin1 比较好。但具体选择哪个 character set 视情况而定,例如 utf8 表示 latin 字符只需要一个字节,所以当用户数据大部分为英文等拉丁字符时,使用 utf8 比较节省数据库的存储空间。
以上这些 character set 的特性,就是用各种 collation 来定义的。
每个 character set 会对应一定数量的 collation,查看方法如下:
MySQL > show collation;
+--------------------------+----------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
|