現在、列挙型フィールドでの MySQL のソート順に関して興味深い問題があります。フィールド列挙エントリは、必要な順序でソートされています。保存するために、その周りに CONCAT を追加したため、MySQL リファレンス ( MySQL リファレンス - Enum )で示唆されているように、char にキャストされ、アルファベット順に並べられます。
ORDER BY CAST(col AS CHAR) または ORDER BY CONCAT(col) をコーディングして、列がインデックス番号ではなく語彙的にソートされていることを確認してください。
しかし、それでは期待した結果が得られなかったため、さらに調査を開始しました。enum と concat 関数の組み合わせでは、order by ステートメントが機能しないようです。次のサンプル スクリプトを作成しました。
CREATE TABLE test (
`col1` enum('a','b','c') COLLATE utf8_bin DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO test
VALUES ('b'), ('c'), ('a');
SELECT * FROM test; -- b, c, a
SELECT * FROM test ORDER BY col1 ASC; -- a, b, c
SELECT * FROM test ORDER BY CAST(col1 AS CHAR) ASC; -- a, b, c
SELECT * FROM test ORDER BY CAST(col1 AS BINARY) ASC; -- a, b, c
SELECT * FROM test ORDER BY CONCAT(col1) ASC; -- b, c, a - This goes wrong
現在、照合/エンコードに何らかの問題があるのではないかと疑っていますが、よくわかりません。私のデータベースのデフォルトのエンコーディングも utf8 です。MySQLのバージョンは5.6.12ですが、MySQL 5.1でも再現できるようです。ストレージ エンジンは MyIsam ですが、メモリ エンジンでも発生します。
どんな助けでも大歓迎です。
アップデート:
この問題は、MySQL 5.6 でのみ発生し、列の照合によって発生するようです。最初の CREATE TABLE ステートメントでは、クエリは正常に機能します。
CREATE TABLE test (
`col1` enum('a','b','c') COLLATE utf8_general_ci DEFAULT NULL
)
2番目はそうではありません。
CREATE TABLE test (
`col1` enum('a','b','c') COLLATE utf8_bin DEFAULT NULL
)
テーブルおよび/またはデータベースの照合は、クエリに影響を与えないようです。クエリは、このSQL Fiddleでテストできます