代码之家  ›  专栏  ›  技术社区  ›  ChrisV

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

  •  6
  • ChrisV  · 技术社区  · 15 年前

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

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

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

    但是我使用的是更模糊的字符,这些字符在大多数字体中都不可用,所以我希望能够使用Unicode字符文本,比如

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

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

    5 回复  |  直到 9 年前
        1
  •  5
  •   Pacerier    10 年前

    您可以指定 hexadecimal literals (甚至 binary literals )使用 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)
    

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

    select char_length(convert(0xC2A2 using utf8mb4))
    

    1


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

    select char_length(convert(0xC1A2 using utf8mb4))
    

    0

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

        2
  •  3
  •   ChrisV    15 年前

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

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

    set names utf8
    

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

    set character set utf8
    

    不。

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

    无论如何谢谢!

        3
  •  2
  •   Pacerier    10 年前

    你可以使用 hex unhex 功能,例如:

    update mytable set myfield = unhex(replace(hex(myfield),'C383','C3'))
    
        4
  •  0
  •   Martin v. Löwis    15 年前

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

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

        5
  •  0
  •   Pacerier    10 年前

    还有 char function 这将允许您想要的内容(提供字节号和字符集名称)并获得一个字符。

    推荐文章