使用regex unicode进行mysql查询
我想做一个mysql查询来捕获: أرأء
这个字符可以键入:( إ
或إ
或ا
或آ
)
所以当键入:
$SQL=" select * from work where title REGEX '[\\u0622|\\u0623|\\u0625|\\u0627][\\u0631][\\u0622|\\u0623|\\u0625|\\u0627][\\u0621]"
它不起作用,我觉得语法不好
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正则表达式字符组中不需要管道符号)
如果你真的无法完全取消你的连接,MySQL确实有一个非标准的二进制字符串转义,您可以使用它来通过另一个编码获取字符:
WHERE title REGEX 0x5bd8a3d8a5d8a7d8a25dd8b15bd8a3d8a5d8a7d8a25dd8a1 AS utf8 - hex-encoded UTF-8 encoded string
通常,您希望避免使用REGEX
因为这意味着title
列上的任何索引都将无效,并且将强制执行完整的表搜索。
一种替代方法是在与表达式匹配的所有16个可能字符串的列表中执行WHERE title IN
。
(最高效的方法是使用数据库排序规则,它已经将所有四个字符都视为相同。但我并不知道这种排序规则与那些令人讨厌的字符匹配。)
这4种Alef变种的utf8是D8A3 D8A5 D8A7 D8A2。 所以,
WHERE HEX(title) REGEXP '^(..)*D8(A3|A5|A7|A2)'
将检查是否存在任何这些。
^(..)*
匹配title
开头的任意数量的字符对(在本例中为hex),然后查找任何这些2字节的utf8代码。
这可能是你正在努力的目标:
$SQL=" select * from work where HEX(title) REGEX '^(..)*D8(A2|A3|A5|A7)D8B1D8(A2|A3|A5|A7)D8A1';
^(..)*
是跳过偶数个hex字符(保持对齐)。
D8(A2|A3|A5|A7)
是4个Alefs的utf8编码。
D8B1
代表Reh。