java使用utf8操作jdbc时数据库是latin1编码时乱码解决

2,558次阅读

共计 1306 个字符,预计需要花费 4 分钟才能阅读完成。

1,正确配置 jdbc 的 url

#6.0 之后就是 com.mysql.cj.jdbc.Driver 了
jdbc.driverClassName=com.mysql.cj.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/loocode?user=root&password=123456&characterEncoding=Cp1252

characterEncoding=Cp1252 意义:

jdbc 会在执行 SQL 之前将 sql 语句字符串转换成对应的 characterEncoding 编码字节

为什么编码配置是 Cp1252 呢,可以看下 jdbc官方文档:

able 5.3 MySQL to Java Encoding Name Translations

MySQL Character Set Name Java-Style Character Encoding Name
ascii US-ASCII
big5 Big5
gbk GBK
sjis SJIS (or Cp932 or MS932 for MySQL Server < 4.1.11)
cp932 Cp932 or MS932 (MySQL Server > 4.1.11)
gb2312 EUC_CN
ujis EUC_JP
euckr EUC_KR
latin1 Cp1252
latin2 ISO8859_2
greek ISO8859_7
hebrew ISO8859_8
cp866 Cp866
tis620 TIS620
cp1250 Cp1250
cp1251 Cp1251
cp1257 Cp1257
macroman MacRoman
macce MacCentralEurope
utf8 UTF-8
ucs2 UnicodeBig

这个是 java 和 mysql 的编码对照表。

2,处理正确的字符串编码

    java 中不需要执行 SET NAMES UTF8 这种语句.

    在代码中字符串应该是使用 GBK 而非 Cp1252.

this.jdbcTemplate = new JdbcTemplate(dataSource);
        //int count = this.jdbcTemplate.queryForObject("SELECT count(*) FROM posts", Integer.class);

SimpleJdbcInsert insert = new SimpleJdbcInsert(this.jdbcTemplate);        insert.withTableName("posts");
insert.usingColumns(new String[] {"user_id", "user_name"});        
HashMap<String, Object> stringObjectHashMap = new HashMap<String, Object>();
stringObjectHashMap.put("user_id", 1);        
// 注意这句话的 GBK, 不能再用 Cp1252
stringObjectHashMap.put("user_name", new String("你好测试".getBytes("GBK")));
insert.execute(stringObjectHashMap);

正文完
 
Blood.Cold
版权声明:本站原创文章,由 Blood.Cold 2019-06-06发表,共计1306字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。