show variables like 'character%'; SHOW VARIABLES LIKE 'collation_%';
在mysql的设置中推荐使用utf8mb4编码而不是utf8, 具体原因请参考下面这篇文章
https://mathiasbynens.be/notes/mysql-utf8mb4
本文将为大家讲解如何处理Java连接过程中的MySQL中文乱码问题。一般MySQL中文乱码问题都是与字符集有关,这里作者的经历也大致差不多。
MySQL默认编码是latin1
mysql> show variables like 'character%'; +--------------------------+--------------------------+ | Variable_name | Value | +--------------------------+--------------------------+ | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | D:\MySQL\share\charsets\ | +--------------------------+--------------------------+ 创建数据表并插入数据
15. mysql> use test; mysql> create table messages ( -> id int(4) unsigned auto_increment primary key, -> message varchar(50) not null -> ) engine=myisam default charset=utf8; mysql> insert into messages (message) values ("测试MySQL中文显示"); mysql> select * from messages; +----+-------------------+ | id | message | +----+-------------------+ | 1 | 测试MySQL中文显示 | +----+-------------------+ 编写程序(Java) import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JDBCTest { public static void main(String[] args) { String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "root"; try { Class.forName(driver); Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); stmt.executeUpdate("insert into messages (message) values ('测试MySQL编码')"); ResultSet rs = stmt.executeQuery("select * from messages"); while (rs.next()) { int id = rs.getInt("id"); String message = rs.getString("message"); System.out.println(id + " " + message); } rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } 程序输出 1 ????MySQL???????? 2 ??MySQL??
设置MySQL的默认字符集为utf8,找到客户端配置[client]在下面添加。
default-character-set=utf8mb4
找到服务器配置[mysqld]在下面添加
default-character-set=utf8mb4
collation-server = utf8mb4_unicode_ci
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
停止和重新启动MySQL
net stop mysql
net start mysql
//实际上,最新mySQL以上两句已经失效,在命令行中先exit 然后重新登录可以实现这个目的
重新连接数据库,查看编码,数据表内容
1. mysql> show variables like 'character%';
MariaDB [(none)]> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 | //该行未更改,建议使用替换,这样能改的全面
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
14. mysql> use test; 15. mysql> select * from messages; 16. +----+-------------------------------+ 17. | id | message | 18. +----+-------------------------------+ 19. | 1 | 虏芒脢脭MySQL脰脨脦脛脧脭脢戮 | 20. | 2 | ??MySQL?? | 21. +----+-------------------------------+ 22. 这里显示依然是乱码主要是因为之前使用的编码不同造成的,重新运行之前写的程序:java JDBCTest 23. 1 ????MySQL???????? 24. 2 ??MySQL?? 25. 3 测试MySQL编码 26. 从第三条记录我们可以看到现在程序连接数据库时可以正常的添加和显示中文了 //如果从MySQL command line中仍然查询不到数据,显示数据集为空,继续完成第三步使得系统的编码和mySQL的编码一致就可以查询出来了……&
27. mysql> select * from messages; 28. +----+-------------------------------+ 29. | id | message | 30. +----+-------------------------------+ 31. | 1 | 虏芒脢脭MySQL脰脨脦脛脧脭脢戮 | 32. | 2 | ??MySQL?? | 33. | 3 | 娴嬭瘯MySQL缂栫爜 | 34. +----+-------------------------------+ 看回数据库的显示,我们会很奇怪的发现为什么显示的都是乱码,这主要是和windows下命令行的编码有关,在命令行上(命令提示符左上角图标处右键属性)查看属性->选项的当前代码页:936 (ANSI/OEM - 简体中文 GBK)(本人机子上是这样显示的) 也就是说命令行上使用的是GBK编码,而我们是在程序连接时使用utf8进行添加的,所以会出现有乱码,现在我们将客户端的编码改成gb2312或gbk试一下 1. mysql> show variables like 'character%'; 2. +--------------------------+--------------------------+ 3. | Variable_name | Value | 4. +--------------------------+--------------------------+ 5. | character_set_client | gb2312 | 6. | character_set_connection | gb2312 | 7. | character_set_database | utf8 | 8. | character_set_filesystem | binary | 9. | character_set_results | gb2312 | 10. | character_set_server | utf8 | //最后你会发现这个还是没有更改,见下文 11. | character_set_system | utf8 | 12. | character_sets_dir | D:\MySQL\share\charsets\ | 13. +--------------------------+--------------------------+ 14. mysql> use test; 15. mysql> select * from messages; 16. +----+-------------------+ 17. | id | message | 18. +----+-------------------+ 19. | 1 | ????MySQL???????? | 20. | 2 | ??MySQL?? | 21. | 3 | 测试MySQL编码 | 22. +----+-------------------+
补充:更改character_set_server,在安装目录的bin文件夹下使用MySQLInstanceConfig.exe配置,在很多步骤中的一步(选择编码)选择第二项(使用UTF-8)或者第三项(自己设定)……更改完毕……
现在可以看到中文正常显示了(主要是因为utf8也支持中文),所以当我们使用命令行工具连接数据库的时候最好将客户端的编码改一下,如果使用GUI的话就不必了,同时修改客户端的编码之后程序依然能够正常显示(以上两点已经测试)
所以如果在程序中要显示中文的话我们可以选用utf8,gb2312,gbk这三种编码,但是如果想在命令行添加中文数据或者查看的话就需要将客户端的编码设置为gb2312或gbk了,还是那句,CMD的编码有关
原文:http://hi.baidu.com/jsmlay/item/1f824518c8bf6d06e75c3637
注意:
遇到一个奇怪的mysql乱码问题,我的mysql全部已经设置成了utf-8,sql-front中文显示也是正常的,通过程序或者是FRONT都能够查找中文,就单单再mysql中是乱码。
mysql> SHOW VARIABLES LIKE 'character_set_%';
-----------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\MySQL\MySQL Server 5.0\share\charsets\ |
+--------------------------+-------------------------------------------+
8 rows in set (0.06 sec)
看似都正常但是在mysql中执行select出来的中文都是乱码,sql-front正常。
mysql命令行下:
安装时是UTF8,my.ini下也改了。可使用show variables like 'character\_set\_%';查看时,发现
character_set_database=labins,character_set_server=labins
查看字符集 show variables like 'character\_set\_%';
修改字符集 set character_set_client=utf8;
MySQL字符集修改命令
1.修改服务器级 a. 临时更改: mysql>SET GLOBAL character_set_server=utf8; b. 永久更改:shell>vi /etc/my.cnf[mysqld]default-character-set=utf8
2.修改数据库级 a. 临时更改: mysql>SET GLOBAL character_set_database=utf8; b. 永久更改:改了服务器级就可以了
3.修改表级 mysql>ALTER TABLE table_name DEFAULT CHARSET utf8; 更改了后永久生效
4.修改列级修改示例: mysql>ALTER TABLE `products` CHANGE `products_model` `products_model` VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL; 更改了后永久生效 5.更改连接字符集 a. 临时更改:mysql> SET NAMES utf8;b. 永久更改: shell>vi /etc/my.cnf在[client]中增加:default-character-set=utf8
set names gbk
jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=utf-8
reference documents
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_character_set_filesystem
http://blog.sina.com.cn/s/blog_81547cad01014x0v.html
http://hatemysql.com/2011/05/17/mysql-character_sets_dir/
https://mathiasbynens.be/notes/mysql-utf8mb4