1
如何轉換數據一樣,轉換轉義UTF-16(JSON實體)恢復正常UTF8 MySQL中
\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d
回到MySQL中正常UTF8?它甚至有可能嗎?
如何轉換數據一樣,轉換轉義UTF-16(JSON實體)恢復正常UTF8 MySQL中
\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d
回到MySQL中正常UTF8?它甚至有可能嗎?
可以字符集之間的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版本...
(和是的,我建議你在生產環境中運行......在此之前做好備份);)
羅,這是PHP的json_encode是硬拼逃出俄羅斯的所有數據和其他語言。 JSON_UNESCAPED_UNICODE剛剛在5.4中引入,我試圖找到更簡單的方法將所有數據轉換回正常。 – Dan 2012-04-07 18:33:01
這是你必須首先unhex()的utf-16。我用一個關於如何在MySQL中完成的例子來編輯我的答案。 – 2012-04-08 00:21:56