1

我如何转换这样的数据

\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d

在 MySQL 中恢复正常的 UTF8?甚至可能吗?

4

1 回答 1

0

您可以通过将数据读取为二进制并将其转换为目标字符集来在 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 版本...

(是的,我建议您在生产环境中运行它之前进行备份......);)

于 2012-04-07T18:24:41.773 回答