我如何转换这样的数据
\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。下面的功能向您展示了如何做到这一点。首先,您 unhex() 这些值,然后从 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 版本...
(是的,我建议您在生产环境中运行它之前进行备份......);)