2

すべてのプロジェクトで、データベースの id フィールドに VARBINARY(16) を使用しています。id は、次のコードによって生成された uuid です。

function gen_uuid() {
    return sprintf('%04x%04x%04x%04x%04x%04x%04x%04x',
        // 32 bits for "time_low"
        mt_rand(0, 0xffff), mt_rand(0, 0xffff),
        // 16 bits for "time_mid"
        mt_rand(0, 0xffff),
        // 16 bits for "time_hi_and_version",
        // four most significant bits holds version number 4
        mt_rand(0, 0x0fff) | 0x4000,
        // 16 bits, 8 bits for "clk_seq_hi_res",
        // 8 bits for "clk_seq_low",
        // two most significant bits holds zero and one for variant DCE1.1
        mt_rand(0, 0x3fff) | 0x8000,
        // 48 bits for "node"
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
}

Windows XP + MySQL 5.5.30 + PhpMyAdmin 3.5.2/3.5.8/4.0.0

PhpMyAdmin で次のクエリを実行すると、空の結果が得られます

SELECT UNHEX('5578fae02ba342e0bc977266f8e08cf6')

MySQLコンソールで実行すると、次の結果が得られます

+-------------------------------------------+
| UNHEX('5578fae02ba342e0bc977266f8e08cf6') |
+-------------------------------------------+
| Ux·α+úBα╝ùrf°αî÷                          |
+-------------------------------------------+

FreeBSD + MySQL 5.5.30 + PhpMyAdmin 3.5.2

PhpMyAdmin で同じクエリを実行すると、結果として ID の 16 進数バージョンが取得されます5578fae02ba342e0bc977266f8e08cf6

MySQL コンソールでクエリを実行すると、XP サーバーと同じ結果が得られます


備考 XP マシンでテーブル データを参照すると、約 10% の行に ID がないように見えます。ソフトウェアとすべての関係は正常に動作しているようです。一見無効な ID でレコードを編集すると、ページのテキスト フィールドに期待される結果が表示されます。保存しても何も修正されません。通常、別のものに変更すると修正されます。

私には PhpMyAdmin の問題のようですが、別のバージョンを試してみても、これまでのところ何も解決されていません。以前は mysql 5.5.29 を実行していて、5.5.30 に更新しましたが、コンソール バージョンは正常に動作しているように見えるので、mysql は除外できると思います。どちらのサーバーも nginx で PHP fast-cgi を実行します。PHPの最新バージョンに更新しても、何も修正されませんでした。

他の UUID は、次のスクリーンショットに示されているように機能します。


XPサーバー XPサーバーが動かない


FreeBSD サーバー ここに画像の説明を入力

4

1 に答える 1

1

PhpMyAdmin のバグであることがわかりました。フォーラムでバグを報告します。

if ($_SESSION['tmp_user_values']['display_binary_as_hex']
     && PMA_Util::containsNonPrintableAscii($column)
) {
    $column = bin2hex($column);
} else {
    $column = htmlspecialchars(
        PMA_Util::replaceBinaryContents(
            $column
        )
    );
}

containsNonPrintableAsciiif ステートメントから関数を削除すると、問題が修正されます。開発サーバーで動作していた理由は、機能を追加するための最初のパッチが私の同僚によって提出されたためであることが判明しました。(そして、後に PhpMyAdmin 開発チームによって破棄されました)

于 2013-04-19T15:11:27.780 に答える