有时候,我们会遇到字符编码不一致导致的程序问题。例如我们的 Java 程序,使用 jdbc 链接。读取的数据,打印出来是乱码。或者是,MySQL 无法识别我们客户端发来的命令。这涉及到字符编码问题。我们需要保持 Java 程序的字符编码与 JDBC 链接指定的字符编码一致,这样才不会有乱码的问题。
指定 Java 程序编码:通过启动参数:-Dfile.encoding=UTF-8 设置默认的字符编码(java.nio.charset.Charset.defaultCharset();)是utf-8(对应 MySQL 的utf8还有utf8mb4)。
指定 JDBC 链接编码:
jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8mysql客户端命令行指定字符集
mysql -h 127.0.0.1 -P 3306 -u root --default-character-set=utf8mb4 -p之后查看有关编码的环境变量,都是和设置的这个字符集一样。
mysql> SHOW VARIABLES LIKE 'character_set_client'; +----------------------+---------+ | Variable_name | Value | +----------------------+---------+ | character_set_client | utf8mb4 | +----------------------+---------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW VARIABLES LIKE 'character_set_connection'; +--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | character_set_connection | utf8mb4 | +--------------------------+---------+ 1 row in set, 1 warning (0.00 sec) mysql> SHOW VARIABLES LIKE 'character_set_results'; +-----------------------+---------+ | Variable_name | Value | +-----------------------+---------+ | character_set_results | utf8mb4 | +-----------------------+---------+ 1 row in set, 1 warning (0.00 sec)其中:
character_set_client: 服务器解码请求时使用的字符集
character_set_connection:服务器处理请求时将字符集转换成这个字符集处理。操作具体列时,在转换为具体列的编码。
character_set_results:服务器向客户端返回数据时使用的字符集
MySQL 设计这三个编码的时候,出于以下考虑:
一个 MySQL,可能有多种不同语言和操作系统或者国家的客户端,所以通过设置character_set_client还有character_set_results进行兼容。
由于操作具体列数据的时候需要编码转换,如果character_set_connection和字段一致的话,就不用转换了,所以设置character_set_connection可以让 MySQL 用一种编码理解命令统一处理,同时设置character_set_connection为最常用的可以减少转换。
一般情况下,保持这三个一致就好。我们就设置好连接使用的字符集就行了。
微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer: