Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4180222
  • 博文数量: 240
  • 博客积分: 11504
  • 博客等级: 上将
  • 技术积分: 4277
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-28 14:24
文章分类

全部博文(240)

分类: Mysql/postgreSQL

2007-03-15 15:08:33

我在这里谈一下 MYSQL的中文模糊搜索。

我的MYSQL版本。

version()
5.1.22-rc-community-log

这里用到的表:

Table   Create Table                                          
------  -------------------------------------------------------
a1      CREATE TABLE `a1` (                                   
          `id` int(11) NOT NULL AUTO_INCREMENT,               
          `str1` char(255) DEFAULT NULL,                      
          PRIMARY KEY (`id`)                                  
        ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 
示例数据:

set names gbk;
insert into a1(str1) values
('靠'),('FUCK'),('fuck'),
('I love your mind.'),
('大话西游'),('卡拉是条狗'),
('没完没了');

(0 row(s)affected)
(0 ms taken)

(7 row(s)affected)
(0 ms taken)


如果想要查出有哪条记录包含卡拉的。
1、用LIKE 语句 。


select * from a1 where str1 like '%卡拉%';


query result(1 records)

id str1
6 卡拉是条狗

2、用INSTR 函数。

select * from a1 where instr(str1,'卡拉') != 0;


query result(1 records)

id str1
6 卡拉是条狗
如果是中英文混合的记录,同样适合。

insert into a1(str1) values('我唉你,卡拉,wo ai ni,I love you');


query result(2 records)

id str1
6 卡拉是条狗
8 我唉你,卡拉,wo ai ni,I love you

这两条语句的效率是一样的。

explain select * from a1 where str1 like '%卡拉%';
explain select * from a1 where instr(str1,'卡拉') != 0;


query result(1 records)

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a1 ALL (NULL) (NULL) (NULL) (NULL) 8 Using where



3、以前的那些所谓的加binary 来查询的,完全是因为编码不对所致,如果遇到中文查不到的话,应该立即检查你的
show variables like '%char%';
的执行结果。
或者说你的MYSQL版本太低的话建议升级到最新稳定版。
binary关键字只在区分大小写或者你要按二进制查询的时候有效。





select * from a1 where binary str1 like '%I love%';


query result(2 records)

id str1
4 I love your mind.
8 我唉你,卡拉,wo ai ni,I love you


select * from a1 where binary str1 like '%i love%';


(0 row(s)returned)
(0 ms taken)
阅读(2232) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-01-16 15:34:38

为什么不用全文索引呢?