0

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

这个 charأ可以这样输入:( أor إor ا or آ )

所以当输入:

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

它不起作用,我认为语法不好

4

2 回答 2

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 个可能的字符串。

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

于 2013-09-03T18:52:25.300 回答
1

这 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 的。

于 2016-09-08T18:10:59.230 回答