2

テーブルに挿入するときにUnicode文字列をUTF-8にデコードしたい。これが私が持っているものです:

('\u0645\u064e\u062b\u0652\u0646\u064e\u0649 \u00a0\u062c \u0645\u064e\u062b\u064e\u0627\u0646\u064d')

したがって、これらの値をUTF-8に変換する必要があります。次に例を示します。

INSERT INTO `nouns`(`NOUNID`, `WORDID`, `SINGULAR`, `PLURAL`) VALUES (781, 3188, '\u0646\u064e\u062c\u0652\u0645', ('\u0646\u064e\u062c\u0652\u0645'))

h2データベースをMySQLに移行しているので、h2dbのスクリプトを作成するときにこれを取得しました。

INSERT INTO PUBLIC.NOUNS(NOUNID, WORDID, SINGULAR, PLURAL) VALUES
  (1, 5, STRINGDECODE('\u0623\u0628\u0651 '), STRINGDECODE
  ('\u0623\u0624\u064f\u0628\u0651')),
  (2, 9, STRINGDECODE('\u0623\u064e\u0628\u0627\u0628'), ''),

基本的に、これらの\ u0623 \ u0632 \ u0651は、Unicode表現のアラビア文字であり、データベースにそのように格納するために、実際のアラビア文字に変換したいと思います。私は変換関数を試していましたが、mysqlを初めて使用するため、これを実現できませんでした。

SELECT CONVERT(_ucs2'\u0623' USING utf8);
4

2 に答える 2

11

MySQLにはUnicodeエスケープをデコードする組み込み関数はありませんが、作成することはできます。下記参照:

MySQLではバックスラッシュはエスケープ文字であるため、SQLを作成するときにバックスラッシュを2倍にする必要があることに注意してください。'\\u0623\\u064e\\u0628\\u0627\\u0628'

DELIMITER //

CREATE FUNCTION STRINGDECODE(str TEXT CHARSET utf8)
RETURNS text CHARSET utf8 DETERMINISTIC
BEGIN
declare pos int;
declare escape char(6) charset utf8;
declare unescape char(3) charset utf8;
set pos = locate('\\u', str);
while pos > 0 do
    set escape = substring(str, pos, 6);
    set unescape = char(conv(substring(escape,3),16,10) using ucs2);
    set str = replace(str, escape, unescape);
    set pos = locate('\\u', str, pos+1);
end while;
return str;
END//

DELIMITER ;
于 2012-06-19T19:43:07.537 に答える
1

@Joniの回答に触発され、関数を使用したくない場合に備えて、すべてを1つのクエリにまとめました。欠点は、クエリを数回実行する必要があることです。これは、実行するたびに、行ごとに1つの「文字」のみが変換されるためです。

UPDATE table_name 
SET content = REPLACE(
  content,
  SUBSTRING(content, locate('\\u', content), 6),
  CHAR(CONV(SUBSTRING(content, LOCATE('\\u', content) + 2, 4), 16, 10)  using 
  ucs2)) 
WHERE content like '%\\u0%';
于 2018-08-22T21:12:53.133 に答える