2014-06-28 35 views
3

原始問題:MySQL的選擇不同的字母,包括擴展的拉丁字符

表結構:

CREATE TABLE `texts` (
    `letter` VARCHAR(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 
    `text` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 
    INDEX (`letter` ASC), 
    INDEX (`text` ASC) 
) 
ENGINE InnoDB 
CHARACTER SET utf8 
COLLATE utf8_general_ci; 

樣本數據:

INSERT INTO `texts` 
(`letter`, `text`) 
VALUES 
('a', 'Apple'), 
('ā', 'Ābols'), 
('b', 'Bull'), 
('c', 'Cell'), 
('č', 'Čakste'); 

其中我執行查詢:

SELECT DISTINCT `letter` FROM `texts`; 

預期結果:

`letter` 
a 
ā 
b 
c 
č 

實際結果:

`letter` 
a 
b 
c 

我試過很多UTF8歸類(utf8_ [彬| general_ci | unicode_ci], utf8mb4_ [彬| general_ci | unicode_ci]等) ,他們都沒有工作。如何 解決這個問題?

編輯澄清:我想要的不僅僅是獲得所有的字母 ,但也得到他們在預期 結果指定的順序。 utf8_bin獲取所有字母,但它們以 錯誤的方式排序 - 擴展拉丁字符僅在所有基本 拉丁字符(例如:a,b,c,ā,č)後面跟隨。此外,我使用的實際表格 每封信都有很多文字,所以分組是必須的。

編輯#2:這裏是從活動站點全表數據 - http://pastebin.com/cH2DUzf3 執行該SQL並運行後,下面的查詢:

SELECT DISTINCT BINARY `letter` FROM `texts` ORDER BY `letter` ASC 

產量幾乎完美的效果,但有一個例外:在'u'之前的字母'ū'是,這很奇怪,至少可以這樣說,因爲所有其他擴展拉丁字母都顯示在它們的基本拉丁版本之後。我如何解決這個最後一個問題?

+0

你嘗試'utf8_bin'? –

+0

@juergend - 添加了一個編輯來澄清一件事。 – jurchiks

+0

想知道結果是什麼: SELECT'letter' FROM'texts'; – ak0053792

回答

3

檢查ManualBINARY

SELECT DISTINCT BINARY `letter` FROM `texts` 

檢查SQL Fiddle

+0

這很好,謝謝! phpMyAdmin顯示擴展的拉丁字母,如'c481'而不是'ā',但是當導出結果集時,它顯示正常。 – jurchiks

+0

啊,一件事。我在'letter'列上有INDEX,默認情況下它會正確地命令字母,但是如果我向查詢中添加ORDER BY letter ASC,那麼排序會變得錯誤,擴展的拉丁字符會再次以基本拉丁字符結束。這是爲什麼?這裏是我的意思的一個例子:http://pastebin.com/57an2pCX – jurchiks

+0

檢查這個鏈接http://sqlfiddle.com/#!2/4f5eb5/1在訂單子句 – Sadikhasan

相關問題