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

Chr*_*isV 6 mysql unicode literals unicode-literals

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

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

Update MyTbl Set MyFld = Replace(MyFld, "?", "y")
Run Code Online (Sandbox Code Playgroud)

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

Update MyTbl Set MyFld = Replace(MyFld, "\u1e8f", "y")
Run Code Online (Sandbox Code Playgroud)

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

Pac*_*ier 5

您可以指定十六进制文字(甚至是二进制文字使用)0xx''X''

select  0xC2A2;
select x'C2A2';
select X'C2A2';
Run Code Online (Sandbox Code Playgroud)

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

select char_length(0xC2A2)
Run Code Online (Sandbox Code Playgroud)

2

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

select convert(0xC2A2 using utf8mb4)
Run Code Online (Sandbox Code Playgroud)

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

select char_length(convert(0xC2A2 using utf8mb4))
Run Code Online (Sandbox Code Playgroud)

1


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

select char_length(convert(0xC1A2 using utf8mb4))
Run Code Online (Sandbox Code Playgroud)

0

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


Chr*_*isV 3

感谢您的建议,但我认为问题出在系统上。

有很多关卡需要取消,但据我所知,(至少在这个服务器上)命令

set names utf8
Run Code Online (Sandbox Code Playgroud)

使 utf-8 处理正确工作,而

set character set utf8
Run Code Online (Sandbox Code Playgroud)

没有。

在我的环境中,这些是使用 PDO 从 PHP 调用的,这可能会产生什么差异。

不管怎么说,还是要谢谢你!