不一樣子系統採用不一樣MySQL編碼LATIN1和UTF8的兼容

程序處理

這是一個歷史遺留系統, 舊的系統是C++開發的, 插入數據的時候, 沒有統一MYSQL各個層次(服務器, 數據庫, 表, 列)的編碼, 這個狀況基本上是MYSQL的默認安裝致使的, 實際的數據編碼爲LATIN1, 而採用Java 開發的新的系統須要和這個遺留系統公用數據庫, 採用的是UTF8編碼, 碰到的問題是Java代碼中獲取到的中文爲亂碼.java

搞清楚了這個問題, Java中把亂碼轉換爲正常顯示的UTF8編碼的中文很簡單, 下面是轉換代碼sql

/**
 * 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 編碼的字符集函數

clipboard.png

最後, 咱們能夠把這樣的轉換作成一張視圖, 程序就不用再轉換了.編碼

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;
相關文章
相關標籤/搜索