2011-07-01 44 views
8

我運行MySQL 50年5月1日,並有一個表,看起來像這樣:MySQL的匹配Unicode字符的ASCII碼版本

organizations | CREATE TABLE `organizations` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `url` text CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, 
    `phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    KEY `id` (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=25837 DEFAULT CHARSET=utf8 | 

我遇到的問題是,MySQL是匹配與ASCII版本的Unicode字符。例如,當我搜索與包含有一個「e」,而不是一個「e」,它將匹配同一個詞一個詞,反之亦然:

mysql> SET NAMES utf8; 
Query OK, 0 rows affected (0.00 sec) 

mysql> SELECT id, name FROM `organizations` WHERE `name` = 'Universite de Montreal'; 
    +-------+-------------------------+ 
| id | name     | 
+-------+-------------------------+ 
| 16973 | Université de Montreal | 
+-------+-------------------------+ 
1 row in set (0.01 sec) 

我同時獲得由PHP和這些結果命令行控制檯。我如何從我的SELECT查詢中獲得準確的匹配?

謝謝!

回答

11

您指定的nametext CHARACTER SET utf8 COLLATE utf8_unicode_ci告訴MySQL來考慮Ëé等同於匹配和排序。整理和utf8_general_ci都使許多事情等價。

http://www.collation-charts.org/一旦您瞭解如何閱讀圖表,這非常容易。

如果你想要e等被認爲是不同的,那麼你必須選擇不同的排序規則。要找出排序規則是你的服務器上的內容(假設你是僅限於UTF-8編碼):

mysql> show collation like 'utf8%'; 

,並選擇使用歸類圖表作爲參考。

另一個特殊排序規則是utf8_bin,其中沒有等價,它是二進制匹配。

我知道的唯一不是語言特定的MySQL Unicode排序規則是utf8_unicode_ciutf8_general_ciutf8_bin。他們很奇怪。排序的真正目的是使計算機與某個人所期望的相匹配並排序。匈牙利語和土耳其語詞典根據不同的規則排序。通過指定排序規則,您可以根據本地規則進行排序和匹配。

例如,看來丹麥人認爲E和E等價的,但冰島人並不:

mysql> select _utf8'e' collate utf8_danish_ci 
    -> = _utf8'é' collate utf8_danish_ci as equal; 
+-------+ 
| equal | 
+-------+ 
|  1 | 
+-------+ 

mysql> select _utf8'e' collate utf8_icelandic_ci 
    -> = _utf8'é' collate utf8_icelandic_ci as equal; 
+-------+ 
| equal | 
+-------+ 
|  0 | 
+-------+ 

另一個方便的技巧是填充一列的表與一羣你感興趣的字符(這是從腳本更容易),然後MySQL能夠告訴你的換算公式:

mysql> create table t (c char(1) character set utf8); 
mysql> insert into t values ('a'), ('ä'), ('á'); 
mysql> select group_concat(c) from t group by c collate utf8_icelandic_ci; 
+-----------------+ 
| group_concat(c) | 
+-----------------+ 
| a    | 
| á    | 
| ä    | 
+-----------------+ 

mysql> select group_concat(c) from t group by c collate utf8_danish_ci; 
+-----------------+ 
| group_concat(c) | 
+-----------------+ 
| a,á    | 
| ä    | 
+-----------------+ 

mysql> select group_concat(c) from t group by c collate utf8_general_ci; 
+-----------------+ 
| group_concat(c) | 
+-----------------+ 
| a,ä,á   | 
+-----------------+ 
+0

非常感謝您的回覆! – user825466

+0

哇!你精美地解釋!非常感謝。 –

1

您已將排序規則設置爲utf8_unicode_ci,它與重音拉丁字符相同。其他信息可以在here找到。

+0

user825466沒有設置'COLLATE utf8_unicode_ci',這就是爲什麼MySQL的返回匹配,如一個在他或她不想例子。 – 2011-07-06 19:23:15

+0

@fsb - 是的,我正在向問題作者解釋他們爲什麼看到整理。我對這個問題的解讀是他們沒有意識到這個事實。 – borrible

+0

你是對的 - 我不知道爲什麼,我也不想讓它發生。我最終用PHP編寫了它,但如果將來需要出現,我將在SELECT語句中指定排序規則。謝謝。 – user825466

1

一件事你可以用你的查詢字符串做的是將其解碼...

< ?php 
$query="उनकी"; // some Unicode characters 
$query=urldecode($query); 
$qry= "SELECT * FROM table WHERE books LIKE '%$query%'"; 

//rest of the code.... 
?> 

它爲我工作。:)

0

我發現,您在使用REGEXP

SELECT * FROM table WHERE name REGEXP 'namé'; 

得到所要求的結果,但如果你試圖準確組的名字並不能幫助。

4

當然,這將工作:

SELECT * FROM table WHERE name LIKE BINARY 'namé'; 
+0

我嘗試了各種排序規則變體,並且'%º%'(有序指示符,不是度數符號)保持匹配不應該匹配的東西。看到這一點,並嘗試它,它像一個魅力工作。謝謝! – RobinHood70