Mysql 中文显示乱码问题理解和解决




一、遇到乱码问题


有时候在 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 |
+--------------------------+----------+-----+---------+----------+---------+
|
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值