今天,一开发同事使用jdbc连接数据库执行一条语句无结果集,但是通过sqlyou执行相同的语句有返回结果。
执行的语句where条件中含有中文,这应该是字符集引起的
查看当前数据库的字符集
mysql> show variables like ‘%charac%‘; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec)
发现server端的字符集都是采用的默认值latin1
发现配置文件中没有添加参数项 character-set-server=utf8
于是赶紧进行字符集设置
mysql> select version(); +------------+ | version() | +------------+ | 5.6.33-log | +------------+ 1 row in set (0.00 sec) mysql> set global character_set_server=utf8; Query OK, 0 rows affected (0.00 sec) mysql> set global character_set_database=utf8; Query OK, 0 rows affected (0.00 sec)
# 指定server端的字符集启动实例 character-set-database 会和 character-set-server 保持一致mysqld --character-set-server=latin1 # And then start the client with the default character set utf8: mysql --default-character-set=utf8 # The current settings can be seen by viewing the output of SHOW VARIABLES:
mysql> SHOW VARIABLES LIKE ‘char%‘; +--------------------------+----------------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/mysql/charsets/ | +--------------------------+----------------------------------------+ 8 rows in set (0.01 sec)
使用gdbc依然差不到结果,需要在jdbc连接数据库的路径中设置字符集
jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf8
引用博客:
mysql 命令行客户端默认使用的字符集也是 latin1,如果你通过这个来插入中文的话也会出现乱码的情况。解决的办法是执行语句 set names ‘utf8’
来告诉服务器使用 UTF-8 编码来和客户端通信。你也可以使用 set charset ‘utf8’
,它和 set names 区别只在于 collation 上。set names 和 set charset 都相当于执行了三条语句,具体的内容可以去看 mysql 文档 10.4 节。我想这个方法在使用 jdbc 的时候也是可以的,所以如果 jdbc 的指定数据库地址中没有告知使用的字符集编码的话可以通过执行上面的语句来达到相同的效果。
字符集参考文献:
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_character_set_connection
http://dev.mysql.com/doc/refman/5.6/en/faqs-cjk.html
时间: 2024-10-26 06:13:23