MySQL的解码统一为UTF-8功能(MySQL decode Unicode to UTF-8 f

2019-07-29 23:58发布

我想在一个表中插入时,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分贝时,我得到这个:

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'), ''),

basicly thees \ u0623 \ u0632 \ u0651是Unicode表示阿拉伯语charchters,我想将它们转换成真正的阿拉伯字符,存储一样,在数据库中。 我试图转换功能,而是因为我是新来的MySQL我无法实现这一目标:

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

Answer 1:

没有内置函数在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 ;


Answer 2:

启发对@乔尼的答案,以防万一你不想使用的功能,我把它一起在一个查询。 其缺点是,你必须执行查询多次,因为对每行只执行一个“人物”得到转化。

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%';


文章来源: MySQL decode Unicode to UTF-8 function