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,所以我在编写 h2 db 脚本时得到了这个:

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 时需要将它们加倍:'\\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 回答的启发,以防万一您不想使用函数,我将它们放在一个查询中。缺点是您必须多次执行查询,因为每次执行时只有一个“字符”逐行被转换。

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 回答