【问题标题】:Unicode (hexadecimal) character literals in MySQLMySQL中的Unicode(十六进制)字符文字
【发布时间】:2011-05-14 11:42:39
【问题描述】:

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

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

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

但是我使用了大多数字体中没有的更晦涩的字符,所以我希望能够使用 Unicode 字符文字,比如

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

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

【问题讨论】:

    标签: mysql unicode literals unicode-literals


    【解决方案1】:

    您可以使用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字节序列。

    【讨论】:

      【解决方案2】:

      还有char function 可以满足您的需求(提供字节数和字符集名称)并获取字符。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          感谢您的建议,但我认为问题出在系统更远的地方。

          有很多级别需要取消,但据我所知,(至少在此服务器上)命令

          set names utf8
          

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

          set character set utf8
          

          没有。

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

          还是谢谢!

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 2020-10-30
              • 2014-12-28
              • 1970-01-01
              • 2011-10-23
              • 2017-03-23
              • 2016-08-02
              • 1970-01-01
              • 1970-01-01
              • 2019-07-27
              相关资源
              最近更新 更多