2

現在、列挙型フィールドでの 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でテストできます

4

2 に答える 2

2

奇妙なことに、このフィドルで動作します。トリガーか何かを持っていますか?

http://sqlfiddle.com/#!2/0976a/2

しかし、5.6では大騒ぎになります:

http://sqlfiddle.com/#!9/0976a/1

おそらくMysqlのバグです。

さらに、「適切な」順序で列挙型に値を入力すると、機能します。

http://sqlfiddle.com/#!9/a3784/1

ドキュメント内:

ENUM 値はインデックス番号に基づいて並べ替えられます。インデックス番号は、列の指定で列挙メンバーがリストされた順序に依存します。たとえば、ENUM('b', 'a') の場合、'b' は 'a' の前に並べ替えられます。

于 2013-09-25T14:27:57.230 に答える