6

たとえば、これは標準の「SORT BY name」クエリが返す順序です。

name
------
Cebbb
Čebbc
Cebbd

名前で並べ替えて、アクセント付きの文字を最初に取得し、他のアクセント付きの文字とグループ化します。

name
------
Čebbc
Cebbb
Cebbd

デフォルトでは、MySql はソートの目的で であるČかのように扱い、示されている順序でソートします。C

あるいは、PHP で、比較のために にČ「変換」できる方法はありますか?C

4

4 に答える 4

8

句に式を追加COLLATEORDER BYできます。

SELECT k
FROM t1
ORDER BY k COLLATE utf8_spanish_ci;

次に、列は正しい照合を使用してソートされ、列の定義はそのまま維持できます。

于 2012-05-04T10:31:03.717 に答える
2

最も簡単な方法は、列自体に適切な照合を適用することです。次に例を示します。

CREATE TABLE foo (
    foo_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(30) NOT NULL COLLATE 'utf8_spanish_ci',
    PRIMARY KEY (`foo_id`)
)
COLLATE='utf8_spanish_ci'
ENGINE=InnoDB;

アップデート:

Čはスペイン語の文字ではありません。

クロアチア語、スロベニア語、ボスニア語、スコルト サーミ語、ラコタ語のアルファベットでは、アルファベットの4 番目の文字です。チェコ語、北サーミ文字、およびバルト言語のリトアニア語とラトビア語では、文字は 5 位です。スロバキア語では、アルファベットの6 番目の文字です。また、パシュトー語 (چ に相当) とサーニッチ語でも使用されます。

数字とは異なり、文字には決まった絶対順序がありません。アルファベット順の概念全体は相対的です。最初にルール セットを選択する必要があります。次の SQL クエリを実行して、MySQL サーバーで使用できるものを確認します。

SHOW CHARACTER SET

...そして、あなたの期待によりよく合うものを選びました。説明書に簡単な説明があります。

于 2012-05-04T10:16:13.080 に答える
0

OK、これは、確かに、非常に特殊なケースに対する私の解決策です。

ORDER BY SUBSTRING(name, 1, 1),
         BINARY SUBSTRING(name, 1, 1),
         name

それは確かに最も効率的なクエリではありませ.

  1. 最初の文字による順序付け (MySql はČCを同一として扱います)
  2. 次に、最初の文字のバイナリ値で並べ替えます。これにより、区別さČれ、C
  3. 次に、完全な名前で並べ替えます。実際には、文字列の残りの部分で並べ替えられます。

これにより、最初の文字の後に最適ではない順序になりますが、それは問題ではありません。

于 2012-05-04T12:08:57.623 に答える
0

アクセントやウムラウトなどの特殊文字を通常のラテン文字に置き換えるには、php 関数を使用できますiconv

iconv("UTF-8", "ASCII//TRANSLIT", $text)

これにより、変数$textが純粋な ASCII 文字に変換されます。たとえば、müßigはmuessigに変換され、cafféeはcaffeeに変換されます。

于 2012-05-04T11:14:58.750 に答える