2011-09-12 30 views
3

编辑3:好的,忘记下面所有复杂的东西。而所有其他列1.MySQL的INSTR和排序规则

SELECT 'a' = 'á', 
     INSTR('András','Andras'), 
     'András' LIKE 'Andras', 
     INSTR('András','Andräs') 

数据库和连接设置为utf8为什么以下结果的第二列设置0:我的问题是,因为这容易。

END编辑

我有一个MySQL的INSTR函数的问题。我有一个包含排序规则utf8_general_ci的表'值'和一个包含值'AndrásSchiff'的VARCHAR列'值'。现在我执行以下查询:

> SET NAMES 'utf8' COLLATE 'utf8_general_ci' 
> SELECT 'a' = 'á'; 
1 
> SELECT * FROM values WHERE value LIKE '%Andras%' 
'András' 
> SELECT * FROM values WHERE INSTR(value,'Andras') 
(Empty) 
> SELECT * FROM values WHERE INSTR(value,'Andräs') 
'András' 

任何人都可以解释这种奇怪的行为吗?我认为LIKE'%...%'和INSTR是等价的,后者具有搜索字符串可能包含'%'的优点。

感谢

编辑:我的MySQL的版本是版本14.14 DISTRIB 54年5月1日,使用readline的6.2

EDIT 2 Debian的Linux-GNU(x86_64的):另一件事我注意到:

> SELECT * FROM values WHERE INSTR(value,'Andras') COLLATE 'utf8_unicode_ci' 

给出错误“COLLATION'utf8_unicode_ci'对于CHARACTER SET'binary'”无效。但我不明白为什么字符集应该是二进制的。

+0

的[INSTR(STR,SUBSTR)不会当STR包含 'E' 或工作“可能重复''和substr只'e'](http://stackoverflow.com/questions/20923186/instrstr-substr-does-not-work-when-str-contains-e-or-e-and-substr-only- e) – Ben

回答

0

运行此命令为mydb数据库

SHOW CREATE DATABASE mydb; 

输出示例:

mysql> show create database conversationminer; 
+-------------------+------------------------------------------------------------------------------+ 
| Database   | Create Database                | 
+-------------------+------------------------------------------------------------------------------+ 
| conversationminer | CREATE DATABASE `conversationminer` /*!40100 DEFAULT CHARACTER SET latin1 */ | 
+-------------------+------------------------------------------------------------------------------+ 

1 row in set (0.00 sec) 

只需要注意的字符集的数据库中。

而且,这样做

SHOW CREATE TABLE values\G 

只需要注意的字符集表的。

+0

谢谢你的回答。数据库的字符集确实是latin1,但更改排序规则并不能解决问题。该表具有utf8作为默认字符集。 – maranos

0

我认为这是Mysql中的一个bug。

我有mysql版本“mysql Ver.14.14 Distrib 5.1.67,for redhat-linux-gnu(x86_64)using readline 5.1”,它的错误“COLLATION'utf8_swedish_ci'对于CHARACTER SET'binary'”无效。

在其他服务器上使用“mysql Ver 14.14 Distrib 5.5.27,对于使用readline 5.1的Linux(i686)”,虽然两者中都有相同的数据库,但没有错误。

因此更新mysql可以解决问题。

0

寻址编辑2部分关于INSTR和整理

以下语法对我的作品

SELECT * FROM values WHERE INSTR(value COLLATE utf8_unicode_ci,'Andras')