有没有办法在MySQL中指定Unicode字符文字?
我想用Ascii字符替换Unicode字符,如下所示:
Update MyTbl Set MyFld = Replace(MyFld, "ẏ", "y")
但是我使用的是大多数字体都没有的更加模糊的字符,所以我希望能够使用Unicode字符文字,比如
Update MyTbl Set MyFld = Replace(MyFld, "\u1e8f", "y")
这个SQL语句是从PHP脚本调用的 - 第一个表单不仅不可读,而且实际上不起作用!
答案 0 :(得分:5)
您可以使用0x
,x''
或X''
指定hexadecimal literals(甚至binary literals):
select 0xC2A2;
select x'C2A2';
select X'C2A2';
但请注意返回类型是二进制字符串,因此每个字节都被视为一个字符。您可以使用char_length
验证这一点:
select char_length(0xC2A2)
2
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)
您可以使用hex
和unhex
功能,例如:
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允许你想要的东西(提供字节数和字符集名称)并获得一个字符。