当前位置:   article > 正文

【MySQL 每日一技】设置和 MySQL 服务端建立连接的客户端使用的字符集_mysql连接指定字符集

mysql连接指定字符集

1. 问题

在使用 MySQL 客户端发送查询语句给服务端后,查询的结果集会返回给 MySQL 客户端,此时你希望指定客户端在显示结果集时使用的字符集。

2. 解决方案

可以使用 SET NAMES 语句或者其他类似功能的方式,从而实现设置客户端字符集的效果。

3. 讨论

当你在应用程序和服务器之间发送和接收信息时,你可能需要告知 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

此时,如果从服务端查询得到的结果集包含一些小语种的文字,那么在显示时可能就会乱码;又或者,如果服务端保存的数据是需要 utf8mb4 字符集才可以完全满足要求的,那么查询得到的结果集用客户端默认的 gbk 字符集还可能出现无法表示的现象(体现也是乱码)。

为了应对可能出现的问题,你可以通过下列方式进行相应字符集的设置1

  • 在建立连接后,在客户端输入下列语句:
mysql> SET NAMES 'utf8';
Query OK, 0 rows affected, 1 warning (0.01 sec)
  • 1
  • 2

然后,再使用上述查询语句,可以看到相应的字符集已经被修改了:

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

实际上,在设置字符集的同时,很多时候也会同时设置默认的比较规则。例如,在上述 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在上述 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

实际上,也可以在修改字符集的同时,不使用默认的比较规则,而是显式地进行指定,相关语句如下:

mysql> SET NAMES 'utf8' COLLATE 'utf8_bin';
Query OK, 0 rows affected, 2 warnings (0.00 sec)
  • 1
  • 2

接着,使用下列语句查询得到的比较规则如下:

mysql> SHOW VARIABLES LIKE 'collation_c%';
+----------------------+----------+
| Variable_name        | Value    |
+----------------------+----------+
| collation_connection | utf8_bin |
+----------------------+----------+
1 row in set, 1 warning (0.01 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 如果客户端程序支持 --default-character-set 选项,你可以使用该选项,实现在客户端程序被调用时进行默认设置。因此,你可以将下列选项加入配置文件中,这样在每次建立和服务端的连接后,就会进行默认的字符集设置:
[mysql]
default-character-set=utf8
  • 1
  • 2
  • 如果在 Unix 或 Linux 上,你设置了 LANGLC_ALL 这样的环境变量,那么 MySQL 的客户端程序会默认检查应该使用哪一个字符集。例如:如果将 LC_ALL 设置为 en_US.UTF-8 ,那么 mysql 程序将默认使用 utf8

  • 部分编程语言的驱动提供了接口来实现类似的功能:

    • 对于 Java ,你可以通过为连接数据库的 URL 指定 characterEncoding 属性来进行客户端所使用字符集的指定,例如:
    jdbc:mysql://localhost/cookbook?characterEncoding=UTF-8
    
    • 1
    • 对于 Python ,你可以通过在建立连接时为 charset 参数指定期望的字符集来实现,例如:
    conn_params = {
        "database": "cookbook",
        "host": "localhost",
        "user": "cbuser",
        "password": "cbpass",
        "charset": "utf8",
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

还需要注意的一点是,你需要确保显示设备所使用的字符集和 MySQL 客户端使用的一致。否则,即使 MySQL 客户端可以正确的处理,最终展示出来的结果也是毫无意义的乱码。

假定你在显示终端上使用 MySQL 客户端程序,你为 MySQL 客户端配置了使用 utf8 ,并且通过客户端向服务端保存了使用该字符集编码的日语信息。如果你将显示终端的字符集设置为了 euc-jp ,即便该字符集也是日语使用的一种字符集,最终在你查询结果后还是无法在该终端上正常显示2


  1. 有一些字符集不能作为建立的连接使用的字符集,例如: ucs2utf16utf16leutf32↩︎

  2. 如果显示终端具备自动检测字符集的功能,那么就不会出现类似的问题。 ↩︎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/368218
推荐阅读
相关标签
  

闽ICP备14008679号