MySQL的INSTR和排序规则

时间:2011-09-12 20:38:38

标签: mysql collation

编辑3:好的,忘记下面所有复杂的东西。我的问题很简单:为什么以下结果的第二列设置为0而其他所有列都为1.

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

数据库和连接设置为utf8。

结束编辑

MySQL的INSTR功能存在问题。我有一个表'值'与collat​​ion utf8_general_ci和一个包含值'AndrásSchiff'的VARCHAR列'value'。现在我执行以下查询:

> 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版本是Ver 14.14 Distrib 5.1.54,对于使用readline 6.2的debian-linux-gnu(x86_64)

编辑2:我注意到的另一件事:

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

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

3 个答案:

答案 0 :(得分: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

请注意表格的字符集。

答案 1 :(得分:0)

我认为这是Mysql中的一个错误。

我有mysql版本“mysql Ver 14.14 Distrib 5.1.67,redhat-linux-gnu(x86_64)使用readline 5.1”并且错误“COLLATION'utf8_swedish_ci'对于CHARACTER SET'binary'”无效。

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

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

答案 2 :(得分:0)

解决有关INSTR和COLLATE的编辑2部分

以下语法适用于我

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