赞
踩
在使用 MySQL 客户端发送查询语句给服务端后,查询的结果集会返回给 MySQL 客户端,此时你希望指定客户端在显示结果集时使用的字符集。
可以使用 SET NAMES
语句或者其他类似功能的方式,从而实现设置客户端字符集的效果。
当你在应用程序和服务器之间发送和接收信息时,你可能需要告知 MySQL 应该使用哪一种字符集比较合适。例如:在 Windows 上,当你建立和 MySQL 服务端的连接后,客户端默认使用的字符集和本机相关,在笔者的机器上就使用了 gbk
字符集。对此,可以使用下列命令进行查看:
mysql> SHOW VARIABLES LIKE '%character_set_c%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| character_set_client | gbk |
| character_set_connection | gbk |
+--------------------------+-------+
2 rows in set, 1 warning (0.01 sec)
此时,如果从服务端查询得到的结果集包含一些小语种的文字,那么在显示时可能就会乱码;又或者,如果服务端保存的数据是需要 utf8mb4
字符集才可以完全满足要求的,那么查询得到的结果集用客户端默认的 gbk
字符集还可能出现无法表示的现象(体现也是乱码)。
为了应对可能出现的问题,你可以通过下列方式进行相应字符集的设置1:
mysql> SET NAMES 'utf8';
Query OK, 0 rows affected, 1 warning (0.01 sec)
然后,再使用上述查询语句,可以看到相应的字符集已经被修改了:
mysql> SHOW VARIABLES LIKE '%character_set_c%';
+--------------------------+---------+
| Variable_name | Value |
+--------------------------+---------+
| character_set_client | utf8mb3 |
| character_set_connection | utf8mb3 |
+--------------------------+---------+
2 rows in set, 1 warning (0.01 sec)
实际上,在设置字符集的同时,很多时候也会同时设置默认的比较规则。例如,在上述 SET NAMES
语句执行之前,执行下列查询比较规则的语句后,结果为:
mysql> SHOW VARIABLES LIKE 'collation_c%';
+----------------------+----------------+
| Variable_name | Value |
+----------------------+----------------+
| collation_connection | gbk_chinese_ci |
+----------------------+----------------+
1 row in set, 1 warning (0.01 sec)
在上述 SET NAMES
语句执行之前,执行下列查询比较规则的语句后,结果为:
mysql> SHOW VARIABLES LIKE 'collation_c%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
+----------------------+-----------------+
1 row in set, 1 warning (0.01 sec)
实际上,也可以在修改字符集的同时,不使用默认的比较规则,而是显式地进行指定,相关语句如下:
mysql> SET NAMES 'utf8' COLLATE 'utf8_bin';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
接着,使用下列语句查询得到的比较规则如下:
mysql> SHOW VARIABLES LIKE 'collation_c%';
+----------------------+----------+
| Variable_name | Value |
+----------------------+----------+
| collation_connection | utf8_bin |
+----------------------+----------+
1 row in set, 1 warning (0.01 sec)
--default-character-set
选项,你可以使用该选项,实现在客户端程序被调用时进行默认设置。因此,你可以将下列选项加入配置文件中,这样在每次建立和服务端的连接后,就会进行默认的字符集设置:[mysql]
default-character-set=utf8
如果在 Unix 或 Linux 上,你设置了 LANG
或 LC_ALL
这样的环境变量,那么 MySQL 的客户端程序会默认检查应该使用哪一个字符集。例如:如果将 LC_ALL
设置为 en_US.UTF-8
,那么 mysql
程序将默认使用 utf8
。
部分编程语言的驱动提供了接口来实现类似的功能:
characterEncoding
属性来进行客户端所使用字符集的指定,例如:jdbc:mysql://localhost/cookbook?characterEncoding=UTF-8
charset
参数指定期望的字符集来实现,例如:conn_params = {
"database": "cookbook",
"host": "localhost",
"user": "cbuser",
"password": "cbpass",
"charset": "utf8",
}
还需要注意的一点是,你需要确保显示设备所使用的字符集和 MySQL 客户端使用的一致。否则,即使 MySQL 客户端可以正确的处理,最终展示出来的结果也是毫无意义的乱码。
假定你在显示终端上使用 MySQL 客户端程序,你为 MySQL 客户端配置了使用 utf8
,并且通过客户端向服务端保存了使用该字符集编码的日语信息。如果你将显示终端的字符集设置为了 euc-jp
,即便该字符集也是日语使用的一种字符集,最终在你查询结果后还是无法在该终端上正常显示2。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。