2011-12-07 30 views
1

如果我尝试在mysql数据库中搜索一个值,并且字符串值中包含点,查询返回0行。例如:当在字符串中用点(。)搜索值时,MySQL查询返回0行

SELECT * FROM table WHERE `username`='marco.polo' --> 0 rows 
SELECT * FROM table WHERE `username` LIKE '%.polo%' --> 0 rows 
SELECT * FROM table WHERE `username` LIKE 'polo' --> Success 

将服务器和数据库移到另一个地方后出现这种情况。我知道这个点是一组扩展正则表达式,但它不应该适用于平等或LIKE运算符,仅仅因为我没有在查询中使用REGEXP。

我测试了我的本地数据库相同的查询,它工作正常。 在mysql中可以有一个特殊的设置来对待点的方式与通常不同吗?

回答

1

user1084605,我试图复制这个问题(使用MySQL版本5.1.37),但得到了与您完全相反的结果。请看下图:

mysql> create table test (username varchar(100)); 
Query OK, 0 rows affected (0.01 sec) 

mysql> insert into test values ('marco.polo'); 
Query OK, 1 row affected (0.00 sec) 

mysql> SELECT * FROM test WHERE `username`='marco.polo'; 
+------------+ 
| username | 
+------------+ 
| marco.polo | 
+------------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM test WHERE `username` LIKE '%.polo%'; 
+------------+ 
| username | 
+------------+ 
| marco.polo | 
+------------+ 
1 row in set (0.00 sec) 

mysql> SELECT * FROM test WHERE `username` LIKE 'polo'; 
Empty set (0.00 sec) 

根据MySQL的文档,使用LIKE操作的时候只特殊字符“%”(百分比:匹配0,1,或多个字符)和“_”(下划线:匹配一个只有一个字符)。 http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

“。” (句点)对于MySQL的REGEXP操作符确实有特殊意义,但它仍然应该与列中的文字句段相匹配。 http://dev.mysql.com/doc/refman/5.0/en/regexp.html

你能复制我上面运行的SQL语句并粘贴你的结果吗?

+1

经过几个小时的调试,我发现该表的默认字符集是亚美尼亚语(创建数据库时创建者可能没有注意,因此首先在列表中被选中)。运行几个ALTER语句并更改为utf8后,所有内容都开始工作。 感谢您的帮助! – cen

0

以下查询处理场景,当我们在列中只有DOT运算符时。

SELECT * FROM test WHERE `username` LIKE '%.%'; 
1

由于@cen已经提到的,字符集可以使这个问题。 我有过这样的例子:

`email` VARCHAR(45) CHARACTER SET 'armscii8' NOT NULL, 

这是在.SQL转储,这点我接受。

因此,当我试图用此电子邮件获取对象 我无法得到它。