程序处理
这是一个历史遗留系统, 旧的系统是 C++ 开发的, 插入数据的时候, 没有统一 MySQL 各个层次 (服务器, 数据库, 表, 列) 的编码, 这个情况基本上是 MySQL 的默认安装导致的, 实际的数据编码为 LATIN1, 而采用 Java 开发的新的系统需要和这个遗留系统公用数据库, 采用的是 UTF8 编码, 碰到的问题是 Java 代码中获取到的中文为乱码.
搞清楚了这个问题, Java 中把乱码转换为正常显示的 UTF8 编码的中文很简单, 下面是转换代码
- /**
- * LATIN1 转 UTF8
- *
- * @param latin1 LATIN1(ISO_8859_1)字符串
- * @return UTF8 字符串
- */
- public String encodingConvert(String latin1) {
- return new String(
- latin1.getBytes(StandardCharsets.ISO_8859_1),
- StandardCharsets.UTF_8
- );
- }
这是使用程序代码的处理方式, 有的时候我们需要直接从 SQL 返回的结果集中直接拿到 UTF8 的数据, 看下面
SQL 内置函数转换
上面通过程序代码可以处理字符集的转换, 下面通过 SQL 的方式转换
CONVERT 和 CAST 函数: 首先需要把 LATIN1 的转为 BINARY, 然后再把 BINARY 转为 UTF8
- SELECT
- USER.USERID AS USERID,
- USER.NICKNAME AS NICKNAME_LATIN1,
- CONVERT (
- CAST(
- CONVERT ( USER.NICKNAME USING latin1 ) AS BINARY
- ) USING utf8
- ) AS NICKNAME_UTF8
- FROM
- USER
- WHERE
- USERID = 15889;
其中 LATIN1_COLUMN 是 LATIN1 编码的字符集
最后, 我们可以把这样的转换做成一张视图, 程序就不用再转换了.
- CREATE VIEW V_USER AS
- SELECT
- USER.USERID AS USERID,
- CONVERT (
- CAST(
- CONVERT ( USER.NICKNAME USING latin1 ) AS BINARY
- ) USING utf8
- ) AS NICKNAME
- FROM
- USER;
来源: http://www.bubuko.com/infodetail-2853620.html