MySQL 的 INSTR 和排序规则

Posted

技术标签:

【中文标题】MySQL 的 INSTR 和排序规则【英文标题】:MySQL's INSTR and collations 【发布时间】:2011-11-15 15:53:20 【问题描述】:

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

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

数据库和连接设置为utf8。

结束编辑

我遇到了 mysql 的 INSTR 函数的问题。我有一个带有排序规则 utf8_general_ci 的表“值”和一个包含值“András Schiff”的 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 版本是 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' 无效”。但我不明白为什么字符集应该是二进制的。

【问题讨论】:

INSTR(str,substr) does not work when str contains 'é' or 'ë' and substr only 'e'的可能重复 【参考方案1】:

为数据库 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

只要记下表格的字符集即可。

【讨论】:

感谢您的回答。数据库的字符集确实是 latin1,但是更改排序规则并没有解决问题。该表具有 utf8 作为默认字符集。【参考方案2】:

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

我有 mysql 版本“mysql Ver 14.14 Distrib 5.1.67, for redhat-linux-gnu (x86_64) using readline 5.1”并且它错误“COLLATION 'utf8_swedish_ci' is not valid for CHARACTER SET 'binary'”。

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

所以更新mysql可以解决问题。

【讨论】:

【参考方案3】:

解决关于 INSTR 和 COLLATE 的 Edit 2 部分

以下语法适用于我

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

【讨论】:

以上是关于MySQL 的 INSTR 和排序规则的主要内容,如果未能解决你的问题,请参考以下文章

MySQL建立数据库时字符集和排序规则的选择

当所有排序规则都已经标准化时,Mysql 非法混合排序规则

Mysql:修改字符集和排序规则

MySQL如何指定字符集和排序规则?

mysql中字符集和排序规则说明

MySQL - 最佳排序规则?