资讯专栏INFORMATION COLUMN

不同子系统采用不同MySQL编码LATIN1和UTF8的兼容

crossea / 2374人阅读

摘要:程序处理这是一个历史遗留系统旧的系统是开发的插入数据的时候没有统一各个层次服务器数据库表列的编码这个情况基本上是的默认安装导致的实际的数据编码为而采用开发的新的系统需要和这个遗留系统公用数据库采用的是编码碰到的问题是代码中获取到的中文为乱码

程序处理

这是一个历史遗留系统, 旧的系统是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的方式转换

CONVERTCAST函数: 首先需要把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;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/72266.html

相关文章

  • MySql(二)——字符集比较规则

    摘要:二字符集和比较规则一些重要的字符集共收录个字符,包括空格标点符号数字大小写字母和一些不可见字符。这个字符集也有一个别名收录汉字个,其他文字符号个。 MySql(二)——字符集和比较规则 一些重要的字符集 ASCII 共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码 ISO 8859-1 共收录256...

    宠来也 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<