2009-04-14 51 views
1

我有一列包含名稱列表。我只需要選擇名稱中的第一個(唯一)字母。 對於非UTF-8字符以下查詢工作得很好:如何選擇第一個字符的唯一列表[MySQL]

SELECT DISTINCT LEFT(T1.Name, 1) AS firstLetter 

然而,當名字以UTF-8編碼的字符,該返回開始: - 符號。我想這只是UTF-8字符串的第一個字符。

在此先感謝。

問題是如何從上面的列中正確選擇完整的第一個字符。

P.S .:表字符集是utf8,排序規則設置爲utf8_bin,字段字符集是utf8,排序規則設置爲utf8_turkish_ci。

回答

5

LEFT(str, 1)是應該的最左邊的字符,不是最左邊的字節。這意味着即使第一個字符是多字節字符,查詢仍在做你想要的。

由於連接/編碼/字體/渲染問題,我猜測後面會出現 符號。嘗試

SELECT LENGTH(LEFT(T1.Name, 1)) AS charLength 

Length返回一個字符串多少字節佔用,所以如果此查詢爲您提供的2個或更多的任何結果,這意味着LEFT()確實返回多字節字符和你的問題在於無法查詢本身。

如果你在命令行中執行查詢,也許你的終端無法呈現的人物,否則,他們越來越錯位別的地方。如果您使用的是腳本語言,請嘗試使用該語言的字符串長度和ord()函數,以幫助瞭解發生了什麼。

編輯:由於您使用的是PHP,試試這個:

//Store a character returned from the database in $unicodechar 
$unicodechar = $row[0]; 

//Now print out the value of each byte in the character 
for($i = 0; $i < strlen($unicodechar); $i++) 
{ 
    echo '0x' . dechex(ord($char[$i])) . ' '; 
} 
echo '\n'; 

舉例來說,如果結果是this character那麼你應該得到 「0xC4 0x9E」。如果你確實得到這種東西,那麼PHP正確獲取多字節字符,而問題是無論是在網頁本身的編碼(見this W3C page)或瀏覽器/字體無法呈現特定的字符。

0

根據文檔,子字符串函數是多字節安全的。我試着用russion數據庫。這應該做的伎倆:

SELECT DISTINCT SUBSTRING(T1.Name, 1, 1) AS firstLetter FROM T1 
+0

不幸的是,它沒有工作:( – turezky 2009-04-14 07:51:38

+0

你發出的選擇與什麼?命令行客戶端通常對於多字節表現不佳,因爲它取決於底層終端。嘗試MySQL查詢瀏覽器或類似的東西。 – 2009-04-14 07:55:09

0

ORD函數將返回代碼,最左邊的兩個字符,如果是多字節或基本ASCII。你可以這樣做:

SELECT DISTINCT ORD(T1.Name) AS firstCode 

爲了讓人物回來,然後你可以使用CHAR函數指定UTF-8字符集得到的東西,如:

SELECT DISTINCT CHAR(ORD(T1.NAME) USING utf8) as firstLetter 
相關問題