MySQL中的Unicode(十六进制)字符文字

时间:2010-11-23 13:51:18

标签: mysql unicode literals unicode-literals

有没有办法在MySQL中指定Unicode字符文字?

我想用Ascii字符替换Unicode字符,如下所示:

Update MyTbl Set MyFld = Replace(MyFld, "ẏ", "y")

但是我使用的是大多数字体都没有的更加模糊的字符,所以我希望能够使用Unicode字符文字,比如

Update MyTbl Set MyFld = Replace(MyFld, "\u1e8f", "y")

这个SQL语句是从PHP脚本调用的 - 第一个表单不仅不可读,而且实际上不起作用!

5 个答案:

答案 0 :(得分:5)

您可以使用0xx''X''指定hexadecimal literals(甚至binary literals):

select  0xC2A2;
select x'C2A2';
select X'C2A2';

请注意返回类型是二进制字符串,因此每个字节都被视为一个字符。您可以使用char_length验证这一点:

select char_length(0xC2A2)
  

2

如果您想要UTF-8字符串,则需要使用convert

select convert(0xC2A2 using utf8mb4)

我们可以看到C2 A2被认为是UTF-8中的1个字符:

select char_length(convert(0xC2A2 using utf8mb4))
  

1


此外,您不必担心无效字节,因为convert会自动删除它们:

select char_length(convert(0xC1A2 using utf8mb4))
  

0

可以看出,输出为0,因为C1 A2是无效的UTF-8字节序列。

答案 1 :(得分:3)

感谢您的建议,但我认为问题又回到了系统中。

要解开很多关卡,但据我所知,(至少在这台服务器上)命令

set names utf8

使utf-8处理正常,而

set character set utf8

在我的环境中,这些是使用PDO从PHP调用的,可能会有什么不同。

非常感谢!

答案 2 :(得分:2)

您可以使用hexunhex功能,例如:

update mytable set myfield = unhex(replace(hex(myfield),'C383','C3'))

答案 3 :(得分:0)

MySQL字符串语法指定为here,如您所见,没有提供数字转义序列。

但是,当您在PHP中嵌入SQL时,可以在PHP中计算正确的字节。确保放入SQL的字节实际上与client character set匹配。

答案 4 :(得分:0)

还有char function允许你想要的东西(提供字节数和字符集名称)并获得一个字符。