1: my.ini 文件中加入 default-character-set =gb2312
2: 字段不要加 Binary 属性
3: 执行 select * from mytable where mysqlname like "%不%"
2: 字段不要加 Binary 属性
3: 执行 select * from mytable where mysqlname like "%不%"
解决方案 »
- ADO.NET中对MySql参数化操作,急啊
- MYSQL中,关于用户的权限的问题。
- MySQL ,一字段值存的是unicode值,查询出来都是乱码了,求解决方法
- 明明是正确的,报错,抓狂了
- 关于索引的弱智问题,这是本人在CSDN上第一次发帖,处女座,久闻CSDN人很热心
- mysql存储过程转换问题
- WINDOWS下的MYSQL的哪个版本支持LOAD DATA LOCAL INFILE...
- 请教一个mysql的sql语句
- how to "update some record from select"?
- 我是个新手,可否告知如何在mysql中导入数据?
- 请问:在Windows XP下能不能使用phpMyAdmin,怎样用?
- 如何更改数据库的端口~!~!?
1:
2:
是最重要的,如果是查询汉字,
select * from mytable where mysqlname like "%不%"如果是大小字区分查询英文字符,
select * from mytable where mysqlname like Binary("%A%")如果上述条件均要
select * from mytable where mysqlname like "%不%" AND mysqlname like Binary("%A%")
不过像这类情况,
已不再建议使用 LIKE '%a%' 形式了
建议使用 全文索引 与 正则表达式 来匹配字串
`name` char(9) NOT NULL default ''
) TYPE=MyISAM;#
# Dumping data for table 't3'
#INSERT INTO `t3` (`name`) VALUES("安花");
INSERT INTO `t3` (`name`) VALUES("不1a");
INSERT INTO `t3` (`name`) VALUES("安花a");
INSERT INTO `t3` (`name`) VALUES("1安花A");
INSERT INTO `t3` (`name`) VALUES("1安花1");
INSERT INTO `t3` (`name`) VALUES("A");
INSERT INTO `t3` (`name`) VALUES("1A1");
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 16 to server version: 4.0.12-nt-logType 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql> use test;
Database changed
mysql> SHOW VARIABLES LIKE 'character_set';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| character_set | gb2312 |
+---------------+--------+
1 row in set (0.00 sec)mysql> SELECT * FROM t3;
+--------+
| name |
+--------+
| 安花 |
| 不1a |
| 安花a |
| 1安花A |
| 1安花1 |
| A |
| 1A1 |
+--------+
7 rows in set (0.00 sec)mysql> SELECT * FROM t3 WHERE name LIKE "%不%";
+------+
| name |
+------+
| 不1a |
+------+
1 row in set (0.00 sec)mysql>
`name`
上面的那个反引号??
不关它们的事的,
最主要的是我所述的1\2两个条件,==========不过像这类情况,
已不再建议使用 LIKE '%a%' 形式了
建议使用 全文索引 与 正则表达式 来匹配字串==========
当你使用 LIKE '%a%' 形式时,
这个查询将不能使用该字段上的索引,
所以这个查询将耗费很大的时间,
所以建议使用 全文索引
你用的是 MySQL-4.0.12 ??
我重试了,
同样的结果,
反引号是不会对结果有什么影响的!
我对一个同样内容的表,
加不加引号引起了两种不同的查找结果!
我用的当然是mysql-4.0.12,还包括win与linux下两个版本(linux下还没有调试)
这个时候index不是根据gbk来建立的,后来如果把default-character-set改成
gbk,index还是没有该过来,必须要重新建立index。manual提供了一个命令重新重新建立index的,但好像只能用于myisam类型的表,
不知道innodb怎么做?你看看一下你的问题是否出在上面提到的情况?另外,我也没有碰到过你说的情况,我也从来没有给字段名加引号的习惯
CREATE TABLE `t3` (
`name` char(9) binary NOT NULL default ''
) TYPE=MyISAM;
试试,结果请通知!
-> `name` char(9) binary NOT NULL default ''
-> ) TYPE=MyISAM;
Query OK, 0 rows affected (0.47 sec)mysql> insert into t3 (name) values ('我不是天使');
Query OK, 1 row affected (0.04 sec)mysql> insert into t3 (name) values ('1安花2');
Query OK, 1 row affected (0.00 sec)mysql> insert into t3 (name) values ('1安花3');
Query OK, 1 row affected (0.00 sec)mysql> select * from t3 where name like '%不%';
+-----------+
| name |
+-----------+
| 我不是天?|
| 1安花2 |
| 1安花3 |
+-----------+
3 rows in set (0.06 sec)
#
# Host: localhost Database: test
# --------------------------------------------------------
# Server version 4.0.12-nt-log
#
# Table structure for table 't3'
#CREATE TABLE `t3` (
`name` char(12) NOT NULL default '',
`name2` char(12) NOT NULL default '',
FULLTEXT KEY `name` (`name`,`name2`)
) TYPE=MyISAM;#
# Dumping data for table 't3'
#INSERT INTO `t3` (`name`, `name2`) VALUES("1", "安换岚缮");
INSERT INTO `t3` (`name`, `name2`) VALUES("2", "不会吧");
INSERT INTO `t3` (`name`, `name2`) VALUES("3", "不会吧1");
INSERT INTO `t3` (`name`, `name2`) VALUES("4", "不会吧 1");
INSERT INTO `t3` (`name`, `name2`) VALUES("5", "真的不会吧");
INSERT INTO `t3` (`name`, `name2`) VALUES("6", "真的 不会吧");mysql> SELECT * FROM t3;
+------+-------------+
| name | name2 |
+------+-------------+
| 1 | 安换岚缮 |
| 2 | 不会吧 |
| 3 | 不会吧1 |
| 4 | 不会吧 1 |
| 5 | 真的不会吧 |
| 6 | 真的 不会吧 |
+------+-------------+
6 rows in set (0.01 sec)# 查找词 "不会吧"
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('不会吧'IN BOOLEAN MODE);
+------+-------------+
| name | name2 |
+------+-------------+
| 2 | 不会吧 |
| 4 | 不会吧 1 |
| 6 | 真的 不会吧 |
+------+-------------+
3 rows in set (0.00 sec)# 查找以词 "不会吧" 开头的任意词句
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('不会吧*' IN BOOLEAN MODE);
+------+-------------+
| name | name2 |
+------+-------------+
| 2 | 不会吧 |
| 4 | 不会吧 1 |
| 6 | 真的 不会吧 |
| 3 | 不会吧1 |
+------+-------------+
4 rows in set (0.01 sec)# 查找以词 "不会吧" 开头的任意词句 并 去除词 "真的"
mysql> SELECT * FROM t3 WHERE MATCH (name,name2)
-> AGAINST ('+不会吧* -真的' IN BOOLEAN MODE);
+------+----------+
| name | name2 |
+------+----------+
| 2 | 不会吧 |
| 4 | 不会吧 1 |
| 3 | 不会吧1 |
+------+----------+
3 rows in set (0.00 sec)
在上例中,
我们可以看出 MySQL 的全文索引对双字节处理的支持还不太好,
| 5 | 真的不会吧 |
这一行记录始终未能查询出来,
这是因为在西文中词是以一个空格为分隔的,
:(
希望在将来的版本中
MySQL 对此能有所改进
而用正则表达式也是会有问题的,
# 查找词 "不会吧"
mysql> SELECT * FROM t3 WHERE name2 REGEXP "不会吧";
+------+-------------+
| name | name2 |
+------+-------------+
| 1 | 安换岚缮 |
| 2 | 不会吧 |
| 3 | 不会吧1 |
| 4 | 不会吧 1 |
| 5 | 真的不会吧 |
| 6 | 真的 不会吧 |
+------+-------------+
6 rows in set (0.00 sec)
# 查找以词 "不会吧" 开头的
mysql> SELECT * FROM t3 WHERE name2 REGEXP "^不会吧";
+------+----------+
| name | name2 |
+------+----------+
| 2 | 不会吧 |
| 3 | 不会吧1 |
| 4 | 不会吧 1 |
+------+----------+
3 rows in set (0.00 sec)
# 查找以词 "不会吧" 结束的
mysql> SELECT * FROM t3 WHERE name2 REGEXP "不会吧$";
+------+-------------+
| name | name2 |
+------+-------------+
| 2 | 不会吧 |
| 5 | 真的不会吧 |
| 6 | 真的 不会吧 |
+------+-------------+
3 rows in set (0.00 sec)