一、背景
最近写一个程序从网站上爬一些股票数据,其中股票名称有中文信息,但保存到数据库一直是乱码。
其实这个问题应该是老生常谈了,网上搜索了一下好多是在客户端设置,即Java代码中设置连接字符串:
jdbc:mysql://127.0.0.1:3306/stock?useUnicode=true&characterEncoding=UTF-8
即加上useUnicode和characterEncoding两个参数;
还有就是设置编辑器的编码,在IDEA里设置文件编码格式,这个只影响代码中字符串常量的情况:
可在我的场景下上述方法依然无效。
二、问题定位
为了排除是不是代码问题,试了直接写字符串常量到数据库,代码如下:
/** * 写入到数据库 * @param str */ private void writeToDb(String str){ try { String connStr;
connStr = "jdbc:mysql://127.0.0.1:3306/stock?useUnicode=true&characterEncoding=UTF-8"; Connection conn = DriverManager.getConnection(connStr, "root", ""); conn.setAutoCommit(false); PreparedStatement pst = conn.prepareStatement("");
String sql = "INSERT INTO test(str) VALUES ('" + str + " ')"; pst.addBatch(sql); pst.executeBatch(); conn.commit();
pst.close(); conn.close();
}catch (Exception ex){
} }
直接调用:
writeToDb("中国平安");
发现还是乱码,初步可以排除客户端的问题,然后看服务端配置,执行以下SQL:
show GLOBAL variables like "%chara%";
结果如下:
原来是服务端编码设置问题,加上以下配置问题解决:
character_set_client=utf8character_set_server=utf8
三、总结
1、保证服务端编码正确
通过执行以下命令看结果,重点看character_set_client和character_set_server:
show GLOBAL variables like "%chara%";
如果不行,在my.ini配置文件加上配置,具体字符集看自己的场景:
character_set_client=utf8character_set_server=utf8
2、Java连接字符串:
jdbc:mysql://127.0.0.1:3306/stock?useUnicode=true&characterEncoding=UTF-8
注意字符集是UTF-8不是UTF8
3、设置IDE
这个因每个ID情况而定,主要解决常量字符串乱码的问题。