摘要:程序處理這是一個歷史遺留系統(tǒng)舊的系統(tǒng)是開發(fā)的插入數(shù)據(jù)的時候沒有統(tǒng)一各個層次服務器數(shù)據(jù)庫表列的編碼這個情況基本上是的默認安裝導致的實際的數(shù)據(jù)編碼為而采用開發(fā)的新的系統(tǒng)需要和這個遺留系統(tǒng)公用數(shù)據(jù)庫采用的是編碼碰到的問題是代碼中獲取到的中文為亂碼
程序處理
這是一個歷史遺留系統(tǒng), 舊的系統(tǒng)是C++開發(fā)的, 插入數(shù)據(jù)的時候, 沒有統(tǒng)一MYSQL各個層次(服務器, 數(shù)據(jù)庫, 表, 列)的編碼, 這個情況基本上是MYSQL的默認安裝導致的, 實際的數(shù)據(jù)編碼為LATIN1, 而采用Java 開發(fā)的新的系統(tǒng)需要和這個遺留系統(tǒng)公用數(shù)據(jù)庫, 采用的是UTF8編碼, 碰到的問題是Java代碼中獲取到的中文為亂碼.
搞清楚了這個問題, Java中把亂碼轉(zhuǎn)換為正常顯示的UTF8編碼的中文很簡單, 下面是轉(zhuǎn)換代碼
/** * LATIN1轉(zhuǎn)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返回的結(jié)果集中直接拿到UTF8的數(shù)據(jù), 看下面
SQL內(nèi)置函數(shù)轉(zhuǎn)換上面通過程序代碼可以處理字符集的轉(zhuǎn)換, 下面通過SQL的方式轉(zhuǎn)換
CONVERT和CAST函數(shù): 首先需要把LATIN1的轉(zhuǎn)為BINARY, 然后再把BINARY轉(zhuǎn)為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 編碼的字符集
最后, 我們可以把這樣的轉(zhuǎn)換做成一張視圖, 程序就不用再轉(zhuǎn)換了.
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;
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/72266.html
摘要:二字符集和比較規(guī)則一些重要的字符集共收錄個字符,包括空格標點符號數(shù)字大小寫字母和一些不可見字符。這個字符集也有一個別名收錄漢字個,其他文字符號個。 MySql(二)——字符集和比較規(guī)則 一些重要的字符集 ASCII 共收錄128個字符,包括空格、標點符號、數(shù)字、大小寫字母和一些不可見字符。由于總共才128個字符,所以可以使用1個字節(jié)來進行編碼 ISO 8859-1 共收錄256...
閱讀 3355·2021-11-24 09:39
閱讀 3279·2021-10-21 09:38
閱讀 2467·2019-08-29 15:28
閱讀 3828·2019-08-26 12:23
閱讀 2688·2019-08-26 12:19
閱讀 1427·2019-08-23 12:44
閱讀 2203·2019-08-23 12:02
閱讀 1147·2019-08-22 17:05