【问题标题】:mysql query with regex unicode使用正则表达式 unicode 的 mysql 查询
【发布时间】:2013-09-06 16:43:11
【问题描述】:

我想做一个 mysql 查询来捕获:أرأء

这个字符 أ 可以这样输入:(أإاآ

所以当输入:

$SQL=" select * from work where title REGEX '[\\u0622|\\u0623|\\u0625|\\u0627][\\u0631][\\u0622|\\u0623|\\u0625|\\u0627][\\u0621]" 

不行,我觉得语法不好

【问题讨论】:

    标签: javascript php jquery mysql css


    【解决方案1】:

    MySQL 没有 \u 转义。尝试在查询字符串中包含原始 Unicode 字符,并通过 utf8 连接将其传递给 MySQL。你如何做到这一点取决于你用来与 MySQL 对话的语言和连接器。最好的办法是从您的语言的本机 Unicode 字符串类型的参数中传递模式字符串(如果有的话);例如在 Python-MySQLdb 中我可以这样做:

    group= u'[أإاآ]'
    pattern= u'%sر%sء' % (chars, chars)
    connection.execute('SELECT * FROM work WHERE title REGEX %s', [pattern])
    

    (nb 正则表达式字符组中不需要管道字符)

    如果您真的无法在连接中使用 Unicode,那么 MySQL 确实有一个非标准的二进制字符串转义,您可以使用它来通过另一种编码获取字符:

    WHERE title REGEX 0x5bd8a3d8a5d8a7d8a25dd8b15bd8a3d8a5d8a7d8a25dd8a1 AS utf8  - hex-encoded UTF-8 encoded string
    

    通常您要避免使用REGEX,因为这意味着title 列上的任何索引都将无效,并且将强制进行全表搜索。

    另一种方法是使用WHERE title IN 列出与表达式匹配的所有 16 个可能的字符串。

    (最高效的方法是使用已经将所有四个字符视为相等的数据库排序规则。不过,我不知道有一个排序规则可以草率地匹配。)

    【讨论】:

    • ,谢谢我用两个内部循环完成了“WHERE title LIKE”以使一切成为可能,并且效果很好,但在我看来它是一个胚胎代码:) 我有 3 组相似的字符。每个元素都应该有所有其他可能性,一个单词可能包含 0 个或多个元素,这很有趣。
    【解决方案2】:

    这 4 个 Alef 变体的 utf8 是 D8A3 D8A5 D8A7 D8A2。所以,

    WHERE HEX(title) REGEXP '^(..)*D8(A3|A5|A7|A2)'
    

    将检查其中任何一个是否存在。

    ^(..)* 匹配title 开头的任意数量的字符对(在本例中为十六进制),然后查找其中任何一个 2 字节 utf8 代码。

    这可能是你所追求的:

    $SQL=" select * from work
        where HEX(title)
            REGEX '^(..)*D8(A2|A3|A5|A7)D8B1D8(A2|A3|A5|A7)D8A1';
    

    ^(..)* 用于跳过偶数个十六进制字符(以保持对齐)。
    D8(A2|A3|A5|A7) 是 4 个 Alef 的 utf8 编码。
    D8B1 用于 Reh。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 2016-04-22
      • 2013-08-20
      相关资源
      最近更新 更多