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

6

有没有一种在MySQL中指定Unicode字符文字的方法?

我想用Ascii字符替换Unicode字符,类似于以下内容:

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

但是我正在使用更加晦涩的字符,这些字符在大多数字体中都不可用,因此我希望能够使用Unicode字符字面量,类似于:

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

这个SQL语句是从一个PHP脚本中调用的 - 第一个形式不仅难以阅读,而且实际上并不能正常工作!

5个回答

5
你可以使用0x, x'', 或者 X''来指定十六进制字面量(甚至是二进制字面量),详见此处此处
select  0xC2A2;
select x'C2A2';
select X'C2A2';

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

select char_length(0xC2A2)

2

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

select convert(0xC2A2 using utf8mb4)

我们可以看到,在UTF-8中,C2 A2被视为1个字符:

select char_length(convert(0xC2A2 using utf8mb4))

1


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

select char_length(convert(0xC1A2 using utf8mb4))

0

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


3
感谢您的建议,但我认为问题出现在系统更深层次。需要解决很多层面的问题,但就我所知,在这个服务器上,命令为:
set names utf8

使utf-8处理正确,而
set character set utf8

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

无论如何,谢谢!


3

您可以使用hexunhex函数,例如:

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

0

MySQL字符串语法在这里指定,可以看到,没有提供数字转义序列的规定。

然而,由于您将SQL嵌入PHP中,因此可以在PHP中计算出正确的字节。确保您放入SQL中的字节实际上与您的客户端字符集匹配。


0

还有一个 char函数,可以实现您所需的功能(提供字节编号和字符集名称),并获得一个字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接