ストアドプロシージャに一時テーブルがあり、問題が発生しています。現れた基本的な症状は、特定の列で注文できないということでした。
-- Mockup table
CREATE TEMPORARY TABLE `result` (
col_a INT,
col_b VARCHAR(100),
col_c VARCHAR(100),
col_d VARCHAR(100));
-- Imagine inserting and updating a bunch of data here...
-- And then we select
SELECT
*
FROM
result
ORDER BY
col_b ASC,
col_c ASC,
col_d ASC;
col_c
上記により、MySQLは、次に順序付けられた結果セットを喜んでぼかしますcol_d
。注文col_b
は一切ありません。
考えられるすべての順列を試し、常に順序付けを拒否する2つの列があると結論付けました(実際のテーブルの実際の名前はそれぞれdepartment
とです)。userid
VARCHAR(100)
INT
それで、一時テーブルで照合とdbエンジンをいじってみましたが、これは効果がありませんでした。どちらの列にも奇妙なデータが見つかりませんでした。
今朝、私はresult
自分が名前を付けたテーブルの正確なコピーを作成して、それにresultCopy
相当するものを作成しようとしました(ただし、実際の列名では、実際のテーブルには15列あり、この例では少し多いです)。
INSERT INTO `resultCopy` (col_a, col_b, col_c, col_d)
SELECT col_a, col_b, col_c, col_d
FROM result;
SELECT
*
FROM
resultCopy
ORDER BY
col_b ASC,
col_c ASC,
col_d ASC;
私が返した結果では、ソートできない両方の列にNULL値しかありませんでした。それ以外の並べ替え順序はまったく同じです。
したがって、元のresult
テーブルにはデータが含まれています(並べ替えられない列を含む)。テーブルから選択すると、このデータが明確に返されます(ターミナルのMySQLクライアントとMySQL Workbenchの両方、および私のアプリケーションでは、並べ替えが間違っています)しかし、このデータを同じ一時テーブルに挿入しようとすると、行方不明になります。
ああ、さらに面白くするためresult
に、プロシージャの最後に一時テーブル()をドロップせず、プロシージャを実行した直後にselectクエリを再度実行すると、正常にソートされます。
それで、誰かがここで何が起こっているのか考えていますか?
MySQLバージョン:5.1.41-3ubuntu12.10