2011-08-15 82 views
1

我需要查找表中仅包含特定日语UTF-8字符的所有条目。REGEX在MySQL中查找日文匹配

例如,我想要所有只包含1(一)和2(二)的字段。

我使用

SELECT combi_id, keb FROM combi WHERE keb REGEXP '[二一]+' 

但它匹配许多包含不同的字符等领域,有什么我做错了吗?

这是表:

CREATE TABLE IF NOT EXISTS `combi` (
     `combi_id` int(11) NOT NULL auto_increment, 
     `ent_seq` int(11) NOT NULL, 
     `reb` text NOT NULL, 
     `keb` text NOT NULL, 
     `ant` text NOT NULL, 
     `ke_pri` text NOT NULL, 
     `re_pri` text NOT NULL, 
     `re_restr` text NOT NULL, 
     `stagr` text NOT NULL, 
     `s_inf` text NOT NULL, 
     `lsource` text NOT NULL, 
     `gloss` text NOT NULL, 
     `xref` text NOT NULL, 
     `stagk` text NOT NULL, 
     PRIMARY KEY (`combi_id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=146740 ; 

,这是数据的样本行:

(22, 1000225, 'あからさま', '明白|偸閑|白地', '', '', '', '', '', '', '', 'plain|frank|candid|open|direct|straightforward|unabashed|blatant|flagrant', '', ''), 

非常感谢您的帮助!

+0

我固定的这个问题[问这个问题不同] [1]。 [1]:http://stackoverflow.com/questions/7067566/unicode-in-mysql-regex – uncovery

回答

1

如果你想与只有这些字符匹配列,你应该使用

SELECT combi_id, keb FROM combi WHERE keb REGEXP '^[二一]+$' 

注^在开始,并在年底的$,意思分别是“字符串的开始”和“字符串结尾“。没有这些,正则表达式可以匹配任何位置。

编辑:测试它

mysql> select * from test; 
+--------+ 
| f1  | 
+--------+ 
| 二  | 
| 東京 | 
| 人  | 
| 丸  | 
+--------+ 
4 rows in set (0.00 sec) 

mysql> select * from test where f1 regexp _utf8'[一二]'; 
+--------+ 
| f1  | 
+--------+ 
| 二  | 
| 東京 | 
| 人  | 
| 丸  | 
+--------+ 
4 rows in set (0.00 sec) 

哇,的确,在MySQL的正则表达式字符类声音严重损坏...... 这工作,但:

mysql> select * from test where f1 regexp _utf8'(一|二)'; 
+------+ 
| f1 | 
+------+ 
| 二 | 
+------+ 
1 row in set (0.00 sec) 
+2

感谢您的输入!问题是这个匹配的结果也是 京,人,亀,丸 – uncovery

+0

在一些测试后编辑我的帖子...它看起来像MySQL是坏的。您仍然可以使用|运营商,它似乎工作正常。 –

+0

这里的问题是它只能工作一半。如果你的样本足够大,仍然有一些误报。我现在所做的是用MySQL REgex预过滤,然后用PHP正则表达式迭代结果。看起来,mysql至少会列出所有正确的条目以及一些可以在另一轮中过滤掉的错误条目。 – uncovery