Mysql中文检索匹配与正则

今天在用sql模糊查询包含字母d的时候,发现一些不包含此字母的也被查询出来了:

SELECT *
FROM custom
WHERE  custom_realname LIKE ‘%d%‘

查询了一下,发现以下说明:

(最后修改为:

SELECT *
FROM custom
WHERE  custom_realname LIKE BINARY ‘%d%‘

今天在做mysql的一个搜索的时候发现我用 select name from contact where name like ‘%a%‘的时候出来的结果除了包含a的名字外连包含中文“新”的名字也出现在搜索结果里面,这令我想弄清楚mysql的匹配模式和规则到底是怎么样的,所以决定查查资料了解了解,另外在匹配的时候正则表达式也很常用!所以准备在这里记录我学习这两个玩意的收获!
出现这个问题的原因是:MySQL在查询字符串时是大小写不敏感的,在编绎MySQL时一般以ISO-8859字符集作为默认的字符集,因此在比较过程中中文编码字符大小写转换造成了这种现象。

解决办法:
1.在建表的时候对于包含中文的字段加上“BINARY”属性,使之进行二进制比较,例如讲"name char(10)"改成"name char(10) BINARY"。但是这样你对该表的该字段进行匹配的时候是区分大小写的。

2.如果使用源码编译MySQL,可以在编译的时候使用--with--charset=gbk参数,这样mysql就直接支持中文查找和排序。

3.使用mysql的locate函数来判断。如:
SELECT * FROM table WHERE locate(substr,str)>0 ;
locate()有两个形式:LOCATE(substr,str)LOCATE(substr,str,pos)。返回substr在str中的位置,如果str不包含substr返回0。这个函数也是不区分大小写的。


4.这样使用sql语句:SELECT * FROM TABLE WHERE FIELDS LIKE BINARY ‘%FIND%‘,但是这和1一样是区分大小写的如果你想进行不区分大小写的查询的时候就要使用upper或者lower进行转换。


5.使用binary和ucase函数及concat函数。ucase是讲英文全部转换大写,concat对字符串进行连接。新的sql语句如下:
select id,title,name from achech_com.news where binary ucase(title) like concat(‘%‘,ucase(‘a‘),‘%‘) 
也可以写为select id,title,name from achech_com.news where binary ucase(title) like ucase(‘%a%‘) 
检索的结果还算满意吧,不过速度可能会因此而慢N毫秒喔。 因为使用like和%进行匹配的话对效率会有一定的影响。

正则表达式:
正则表达式是为复杂搜索指定模式的强大方式。

所匹配的字符串以后面的字符串开头 
mysql> select "fonfo" REGEXP "^fo$"; -> 0(表示不匹配) 
mysql> select "fofo" REGEXP "^fo"; -> 1(表示匹配) 

所匹配的字符串以前面的字符串结尾 
mysql> select "fono" REGEXP "^fono$"; -> 1(表示匹配) 
mysql> select "fono" REGEXP "^fo$"; -> 0(表示不匹配) 
.
匹配任何字符(包括新行) 
mysql> select "fofo" REGEXP "^f.*"; -> 1(表示匹配) 
mysql> select "fonfo" REGEXP "^f.*"; -> 1(表示匹配) 
a* 
匹配任意多个a(包括空串) 
mysql> select "Ban" REGEXP "^Ba*n"; -> 1(表示匹配) 
mysql> select "Baaan" REGEXP "^Ba*n"; -> 1(表示匹配) 
mysql> select "Bn" REGEXP "^Ba*n"; -> 1(表示匹配)

a+
匹配1个或多个a字符的任何序列。

mysql> select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配) 
mysql> select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配)

a? 
匹配一个或零个a 
mysql> select "Bn" REGEXP "^Ba?n"; -> 1(表示匹配) 
mysql> select "Ban" REGEXP "^Ba?n"; -> 1(表示匹配) 
mysql> select "Baan" REGEXP "^Ba?n"; -> 0(表示不匹配)

de|abc 
匹配de或abc 
mysql> select "pi" REGEXP "pi|apa"; -> 1(表示匹配) 
mysql> select "axe" REGEXP "pi|apa"; -> 0(表示不匹配) 
mysql> select "apa" REGEXP "pi|apa"; -> 1(表示匹配) 
mysql> select "apa" REGEXP "^(pi|apa)$"; -> 1(表示匹配) 
mysql> select "pi" REGEXP "^(pi|apa)$"; -> 1(表示匹配) 
mysql> select "pix" REGEXP "^(pi|apa)$"; -> 0(表示不匹配)

(abc)* 
匹配任意多个abc(包括空串) 
mysql> select "pi" REGEXP "^(pi)*$"; -> 1(表示匹配) 
mysql> select "pip" REGEXP "^(pi)*$"; -> 0(表示不匹配) 
mysql> select "pipi" REGEXP "^(pi)*$"; -> 1(表示匹配)

{1} {2,3} 
这是一个更全面的方法,它可以实现前面好几种保留字的功能 
a* 
可以写成a{0,} 

可以写成a{1,} 
a? 
可以写成a{0,1} 
在{}内只有一个整型参数i,表示字符只能出现i次;在{}内有一个整型参数i, 
后面跟一个“,”,表示字符可以出现i次或i次以上;在{}内只有一个整型参数i, 
后面跟一个“,”,再跟一个整型参数j,表示字符只能出现i次以上,j次以下 
(包括i次和j次)。其中的整型参数必须大于等于0,小于等于 RE_DUP_MAX(默认是25 
5)。 如果同时给定了m和n,m必须小于或等于n.

[a-dX], [^a-dX]

匹配任何是(或不是,如果使用^的话)a、b、c、d或X的字符。两个其他字符之间的“-”字符构成一个范围,与从第1个字符开始到第2个字符之间的所有字符匹配。例如,[0-9]匹配任何十进制数字 。要想包含文字字符“]”,它必须紧跟在开括号“[”之后。要想包含文字字符“-”,它必须首先或最后写入。对于[]对内未定义任何特殊含义的任何字符,仅与其本身匹配。

mysql> select "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配) 
mysql> select "aXbc" REGEXP "^[a-dXYZ]$"; -> 0(表示不匹配) 
mysql> select "aXbc" REGEXP "^[a-dXYZ] $"; -> 1(表示匹配) 
mysql> select "aXbc" REGEXP "^[^a-dXYZ] $"; -> 0(表示不匹配) 
mysql> select "gheis" REGEXP "^[^a-dXYZ] $"; -> 1(表示匹配) 
mysql> select "gheisa" REGEXP "^[^a-dXYZ] $"; -> 0(表示不匹配)

[[.characters.]] 
表示比较元素的顺序。在括号内的字符顺序是唯一的。但是括号中可以包含通配符, 
所以他能匹配更多的字符。举例来说:正则表达式[[.ch.]]*c匹配chchcc的前五个字符 

[=character_class=] 
表示相等的类,可以代替类中其他相等的元素,包括它自己。例如,如果o和( )是 
一个相等的类的成员,那么[[=o=]]、[[=( )=]]和[o( )]是完全等价的。

[:character_class:] 
在括号里面,在[:和:]中间是字符类的名字,可以代表属于这个类的所有字符。 
字符类的名字有: alnum、digit、punct、alpha、graph、space、blank、lower、uppe 
r、cntrl、print和xdigit 
mysql> select "justalnums" REGEXP "[[:alnum:]] "; -> 1(表示匹配) 
mysql> select "!!" REGEXP "[[:alnum:]] "; -> 0(表示不匹配)


alnum


文字数字字符


alpha


文字字符


blank


空白字符


cntrl


控制字符


digit


数字字符


graph


图形字符


lower


小写文字字符


print


图形或空格字符


punct


标点字符


space


空格、制表符、新行、和回车


upper


大写文字字符


xdigit


十六进制数字字符

[[:<:]] 
[[:>:]] 
分别匹配一个单词开头和结尾的空的字符串,这个单词开头和结尾都不是包含在alnum中 
的字符也不能是下划线。 
mysql> select "a word a" REGEXP "[[:<:]]word[[:>:]]"; -> 1(表示匹配) 
mysql> select "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -> 0(表示不匹配) 
mysql> select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1(表示 
匹配)

要想在正则表达式中使用特殊字符的文字实例,应在其前面加上2个反斜杠“/”字符。MySQL解析程序负责解释其中一个,正则表达式库负责解释另一个。例如,要想与包含特殊字符“+”的字符串“1+2”匹配,在下面的正则表达式中,只有最后一个是正确的:

mysql> SELECT ‘1+2‘ REGEXP ‘1+2‘;                       -> 0
mysql> SELECT ‘1+2‘ REGEXP ‘1/+2‘;                      -> 0
mysql> SELECT ‘1+2‘ REGEXP ‘1//+2‘;                     -> 1
时间: 2024-10-09 07:17:44

Mysql中文检索匹配与正则的相关文章

Linux下PHP+MySQL+CoreSeek中文检索引擎配置

说明: 操作系统:CentOS 5.X 服务器IP地址:192.168.21.127 Web环境:Nginx+PHP+MySQL 站点根目录:/usr/local/nginx/html 目的:安装coreseek中文检索引擎,配置MySQL数据库访问接口,使用PHP程序实现中文检索. CoreSeek官方网站: http://www.coreseek.cn/ http://www.coreseek.cn/products/=%22/products-install/step_by_step/ h

Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办--转自http://www.jb51.net/article/88236.htm

这篇文章主要介绍了Mybatis使用MySQL模糊查询时输入中文检索不到结果的解决办法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 项目开发中,在做Mybatis动态查询时,遇到了一个问题:MySQL在进行LIKE模糊查询时,输入英文可以正常检索出结果,但是输入中文后检索得到的结果为空. 由于是使用GET方式请求,所以为了确保中文不乱码,在控制台接收到请求参数后,对中文进行了一次编码. ? 1 2 3 4 5 try { realName = new String(realNam

通过g++查询到的mysql中文数据输出是乱码

这几天遇到一个问题: 通过g++查询到的mysql中文数据输出是乱码,而通过g++添加到mysql中的中文数据也是乱码,但单独通过g++输出正常,查询通过mysql添加的中文数据显示也正常. 在网查查询了很久,纠结了半天也没有找到答案.后来通过在linux吧发帖终于找到了解决方案.原来是mysql和g++默认字符集不匹配产生的问题.通过在代码中添加 int mysql_set_character_set(MYSQL *mysql, char *csname)函数终于解决了问题. 源码如下: #i

开源中文检索引擎Coreseek简单使用

Coreseek结合MySQL使用简单示例,如下所示: echo 北京 | iconv -f gbk -t utf-8 | search -c D:\web\coreseek\etc\csft_mysql.con echo 描述 | iconv -f gbk -t utf-8 | search -c D:\web\coreseek\bin\coreseek.conf --stdin | iconv -f utf-8 -t gbk echo 金额 | iconv -f gbk -t utf-8 |

coreseek 中文检索

简单介绍:最近有人在问我,说mysql5.6既然已经支持了Innodb的全文索引了,为什么依然有人在使用sphinx这样的软件针对mysql 数据库呢. 第一:目前仍然后很多公司在使用mysql5.5,针对innodb 存储引擎则需要全文索引的软件来帮忙 第二:mysql并不是一款中国人开发的服务,因此对中文分词的支持是不行的,由此引出接下来所要讲解的coreseek 中文检索 因有童鞋对安装和基本使用有困惑,因而将本人的基本操作写上,如有疑问请留言 安装 稳定版 wget http://219

【转载】Python使用中文正则表达式匹配指定中文字符串的方法示例

本文实例讲述了Python使用中文正则表达式匹配指定中文字符串的方法.分享给大家供大家参考,具体如下: 业务场景: 从中文字句中匹配出指定的中文子字符串 .这样的情况我在工作中遇到非常多, 特梳理总结如下. 难点: 处理GBK和utf8之类的字符编码, 同时正则匹配Pattern中包含汉字,要汉字正常发挥作用,必须非常谨慎.推荐最好统一为utf8编码,如果不是这种最优情况,也有酌情处理. 往往一个具有普适性的正则表达式会简化程序和代码的处理,使过程简洁和事半功倍,这往往是高手和菜鸟最显著的差别.

js正则表达式验证、匹配数字、匹配字符串、匹配中文、匹配任意字符备忘录

本文转自:91博客 :原文地址:http://www.9191boke.com/235792704.html 正则表达式或“regex”用于匹配字符串的各个部分,下面是我创建正则表达式的备忘录.包括一些常用的验证.匹配数字.匹配字符串.匹配中文.匹配任意字符串. 匹配正则 使用 .test() 方法 let testString = "My test string"; let testRegex = /string/; testRegex.test(testString); 匹配多个模

解决springmvc+mybatis+mysql中文乱码问题【转】

这篇文章主要介绍了解决java中springmvc+mybatis+mysql中文乱码问题的相关资料,需要的朋友可以参考下 近日使用ajax请求springmvc后台查询mysql数据库,页面显示中文出现乱码 最初在mybatis配置如下 <select id="queryContentById" resultType = "java.lang.String" parameterType="String" >     select t

python匹配ip正则

python匹配ip正则 #!/usr/bin/env python # -*- coding:utf-8 -*- import re ip_str = "asdad1.1.1.1sdfwe2.6.5.7sdfsf2.3.94.5sdf200.198.25.0" res = [] for i in range(1): ip_t = True m_ind = 0 while ip_t: m = re.search(r"(((2([0-4]\d|5[0-5])|((1\d|[1-