编辑3:好的,忘记下面所有复杂的东西。我的问题很简单:为什么以下结果的第二列设置为0而其他所有列都为1.
SELECT 'a' = 'á',
INSTR('András','Andras'),
'András' LIKE 'Andras',
INSTR('András','Andräs')
数据库和连接设置为utf8。
结束编辑
MySQL的INSTR功能存在问题。我有一个表'值'与collation 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'”无效。但我不明白为什么字符集应该是二进制的。
答案 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')