zoukankan      html  css  js  c++  java
  • 不同子系统采用不同MySQL编码LATIN1和UTF8的兼容

    程序处理

    这是一个历史遗留系统, 旧的系统是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://segmentfault.com/a/1190000017061900

  • 相关阅读:
    127.0.0.1:8080 不在以下 request 合法域名列
    [SAP] 34. System Manager
    [SAP] 33. Deployment and instance management
    [Angular] State provider solutions
    [Cloud Architect] 9. Securing Access to Cloud Services
    [Git] Squash commits
    [Angular] Overlay CDK
    [Cloud Architect] 8. Infrastructure as Code
    [DevOps] Terraform Remote State Management
    [DevOps] Using Terraform to Create an EC2 Instance
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9986484.html
Copyright © 2011-2022 走看看