MySQL REGEXP与俄语字符无法正常工作

时间:2016-11-15 18:17:23

标签: mysql regex

SELECT 'Hello' REGEXP '^[^aeiouAEIOU][A-Za-z]*$' -> 1

SELECT 'Привет' REGEXP '^[^аеиоуыэюяАЕИОУЫЭЮЯ][А-Яа-я]*$' -> 0 - 必须返回1.

1 个答案:

答案 0 :(得分:0)

MySQL的REGEXP仅适用于字节俄语字符均为2个字节。

对于限制为西里尔语,这似乎是正确的:

SELECT HEX('Привет') REGEXP '^((D0|D1)..)+$'; -- > 1

(我将在一分钟内解决避免引导元音的问题。)

解释:

  • 所有俄语字符均为2个字节,第一个字节为十六进制D0D1。 (从那种方式开始可能有非俄语字符;我忽略了这个问题。)
  • (...|...) - |表示“或”。
  • ..匹配一个2字节的十六进制,表示第二个字节可以是任何东西(这是过度杀伤但可能没有伤害)。
  • (...)+ - 加号表示一次或多次出现。
  • ^$'锚定'正则表达式以包含整个字符串。

返回 no-leading-vowel 问题。现在我们需要玩一些痛苦的游戏来列出元音;他们的HEX似乎是

D0, followed by any of B0 B5 B8 BE
                       90 95 98 9E, or 
D1, followed by any of 83 8B 8D 8E 8F
                       A3 AB AD AE AF

示例:select hex('э'); - > D18D

将所有内容放在一起会很混乱,因为MySQL没有(?工具来说“不”。所以,我将首先测试 一个主要的元音:

SELECT HEX('Привет')
REGEXP '^(D0(B0|B5|B8|BE|90|95|98|9E))|(D1(83|8B|8D|8E|8F|A3|AB|AD|AE|AF))'

正确失败。

现在把事情放在一起:

SELECT NOT HEX('Привет')
REGEXP '^(D0(B0|B5|B8|BE|90|95|98|9E))|(D1(83|8B|8D|8E|8F|A3|AB|AD|AE|AF))'
AND        HEX('Привет')
REGEXP '^((D0|D1)..)+$';

第一部分检查NOT一个主要元音;第二部分检查所有字符是俄语。

该测试用例有效,而'э'0回来,但我可能已经在某个地方蠢蠢欲动。

(这是一个挑战。)