不同子系統采用不同MySQL編碼LATIN1和UTF8的兼容
阿新 • • 發佈:2018-11-20
inf 處理 ets 顯示 select stand ret src 不用
程序處理
這是一個歷史遺留系統, 舊的系統是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;
原文地址:https://segmentfault.com/a/1190000017061900
不同子系統采用不同MySQL編碼LATIN1和UTF8的兼容