mysql使用正则表达式匹配中文所遇到的问题
1.前言
计算机毕竟是外国人发明的,虽然计算机语言是机器语言,并不是某一种外语,但是计算机语言对于英语的适配性明显还是高于中文。在现在utf-8编码普及后,在程序里,中文字符和英文字符在很多情况下都可以兼容。毕竟都属于字符集中的一部分。但是在某些地方,对中文的支持还是有一定问题。
2.遇到的问题。在mysql中可以用正则表达式来匹配查询(类似于like,比like更灵活)。但是在用正则表达式匹配中文的时候出现了问题。
3.select 'abcdefg' regexp '^a.{5}g$',这一句sql不需要依赖数据库表就可以执行,返回结果是0或1.0代表匹配失败,1代表匹配成功。整个正则表达式是^a.{5}g$,表示以a开头,以g结尾,中间有五个任意字符。
4.把上面的匹配换成中文,则会出现问题。select '笑傲独行侠' regexp '^笑.{3}侠$';返回的结果竟然是0,也就是匹配失败了。仔细检查了一下正则表达式,以笑开头,以侠结尾,中间三个任一字符,没毛病。但是就是返回0.这说明,对中文的个数处理和英文不同。改成
select '笑傲独行侠' regexp '^笑.{9}侠$'则匹配成功。说明一个中文字符,在正则匹配的时候会被计算为三个字符!
5.该怎么解决。所以在真正程序开发的时候,遇到的问题是这种形式:select * from table where table.name regexp '(笑傲独行侠){3}',即想要用中文来检索匹配时,将中文字符括起来。这样后面紧跟的量词才会计算准确。