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 和排序规则的主要内容,如果未能解决你的问题,请参考以下文章