そのようなデータを変換するにはどうすればよいですか
\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エンティティは16進数の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のバージョンを確認する必要があるかもしれません...
(そうです、実稼働環境でこれを実行する前にバックアップを作成することをお勧めします...);)