1

ストアドプロシージャに一時テーブルがあり、問題が発生しています。現れた基本的な症状は、特定の列で注文できないということでした。

-- 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とです)。useridVARCHAR(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

4

0 に答える 0