2011-09-12 58 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')