2009-04-14 20 views
1

名前のリストを含む列があります。名前から最初の(ユニークな)文字だけを選択する必要があります。しかし最初の文字の一意のリストを選択する方法[MySQL]

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

、名前がUTF-8エンコードされた文字で始まる場合、これが返されます:次のクエリはかなりうまく機能非UTF-8文字の場合 -sign。私はそれがUTF-8文字列の最初の文字だと思います。

ありがとうございます。

質問は、上の列から完全な最初の文字を正しく選択する方法です。

P .:テーブル文字セットはutf8で、照合順序はutf8_binに設定され、フィールド文字セットはutf8で、照合順序はutf8_turkish_ciに設定されます。

答えて

5

LEFT(str, 1)になっている:あなたは、その後のようなものを取得するにはUTF-8文字セットを指定するCHAR機能を使用することができ、背中の文字を取得するには

SELECT DISTINCT ORD(T1.Name) AS firstCode 

:あなたのような何かを行うことができます左端文字、左端ではありませんバイトです。これは、たとえ最初の文字がマルチバイト文字であっても、クエリが望んでいることを意味します。

接続/エンコーディング/フォント/レンダリングの問題により、後で 記号が出現すると思います。文字列が占めるので、このクエリはあなたに2以上のいずれかの結果が得られるならば、これはLEFT()が実際にマルチバイト文字を返していることを意味し、あなたの問題は、クエリ自体向こうにあるどのように多くのバイト

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

LENGTHの戻りを試してみてください。

コマンドラインでクエリを実行している場合、端末が文字をレンダリングできないか、そうでなければどこかで文字化けしている可能性があります。スクリプティング言語を使用している場合は、その言語の文字列の長さとord()関数を使用して、何が起こっているのかを調べてください。

EDIT:結果はthis character、あなたが "0xC4 0x9E" を取得する必要です例えば場合

//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'; 

:あなたがPHPを使用しているので、これを試してみてください。実際にこのようなことが起こった場合、PHPはマルチバイト文字を正しく取得していますが、問題はWebページ自体のエンコーディング(this W3C page参照)か、ブラウザ/フォントがその特定の文字をレンダリングできません。

+0

そうですね、これも私が疑うところです。私の答えのコメントを参照してください。私はその間にLEFTも試しましたが、マルチバイトも認識しています。 –

+0

実際、charの長さとして2が返されました。ヘッドアップをありがとう! // PHPを使用して結果を表示しています。 – turezky

0

ドキュメントによれば、部分文字列関数はマルチバイトセーフです。私は、ロシアのデータベースを使ってみました。これは、トリックを行う必要があります。

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

残念ながら、それはうまくいきませんでした:( – turezky

+0

あなたはどのようにselectを発行しますか?コマンドラインクライアントは、通常、マルチバイトで動作しません。これは、基本となる端末に依存します。 MySQL Query Browserなどを試してみてください。 –

0

ORD関数はマルチバイトまたは基本的なASCIIで両方の場合は一番左の文字のコードを返します。

SELECT DISTINCT CHAR(ORD(T1.NAME) USING utf8) as firstLetter 
関連する問題