2012-04-07 32 views

回答

1

可以字符集之間的MySQL通過讀取數據爲二進制和轉換將其轉換爲目標字符集,像這樣(如果你有一個表叫example和列名爲data

UPDATE `example` SET data=CONVERT(CONVERT(`data` USING binary) USING utf8); 

的JSON \ uXXXX實體採用十六進制UTF-16編碼,所以如果你有一個支持utf-16的mysql版本,你可以將它們轉換爲utf-8,下面的函數告訴你如何去做。值然後從UTF-16轉換爲UTF-8:

DELIMITER @@ 
CREATE FUNCTION Unjson (instring TEXT CHARACTER SET utf8) 
RETURNS TEXT CHARACTER SET utf8 
BEGIN 

    DECLARE i INT DEFAULT 0; 
    DECLARE c VARCHAR(1); 
    DECLARE utfstr TEXT CHARACTER SET utf16 DEFAULT ""; 
    DECLARE outstring TEXT CHARACTER SET utf8 DEFAULT ""; 

    WHILE i < CHAR_LENGTH(instring) DO 
    SET i = i + 1; 
    SET c = SUBSTRING(instring, i, 1); 
    IF c = "\\" THEN 
     SET c = SUBSTRING(instring, i + 1, 1); 
     IF c = "u" THEN 
     SET utfstr = CONCAT(utfstr, UNHEX(SUBSTRING(instring, i + 2, 4))); 
     SET i = i + 5; 
     END IF; 
    ELSE 
     IF utfstr != "" THEN 
     SET outstring = CONCAT(outstring, CONVERT(utfstr USING utf8)); 
     SET utfstr = ""; 
     END IF; 
     SET outstring = CONCAT(outstring, c); 
    END IF; 
    END WHILE; 
    IF utfstr != "" THEN 
    SET outstring = CONCAT(outstring, CONVERT(utfstr USING utf8)); 
    END IF; 

    RETURN outstring; 
END@@ 
DELIMITER ; 

有了這個MySQL的功能,你可以將你的表有:

UPDATE `table_name` SET `column_name`=Unjson(`column_name`); 

我使用MySQL 5.5,但我不認爲有5.0 UTF-16的支持,所以你可能要檢查你的MySQL版本...

(和是的,我建議你在生產環境中運行......在此之前做好備份);)

+0

羅,這是PHP的json_encode是硬拼逃出俄羅斯的所有數據和其他語言。 JSON_UNESCAPED_UNICODE剛剛在5.4中引入,我試圖找到更簡單的方法將所有數據轉換回正常。 – Dan 2012-04-07 18:33:01

+0

這是你必須首先unhex()的utf-16。我用一個關於如何在MySQL中完成的例子來編輯我的答案。 – 2012-04-08 00:21:56