MySQL UNHEX函数在phpmyadmin中显示意外结果

时间:2013-04-19 14:07:04

标签: mysql phpmyadmin

对于我的所有项目,我对数据库中的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的十六进制版本作为结果5578fae02ba342e0bc977266f8e08cf6

在MySQL控制台中运行查询会产生与我的XP服务器相同的结果


说明 如果我在我的XP机器上浏览表数据,大约10%的行似乎没有ID。软件和所有关系似乎都正常工作。如果我使用看似无效的ID编辑记录,我可以在页面上的文本字段中看到预期的结果。保存它不能解决任何问题,通常会将其更改为另一个。

对我来说,这似乎是PhpMyAdmin的一个问题,但尝试不同的版本到目前为止还没有为我修复任何问题。我以前运行mysql 5.5.29并更新到5.5.30但由于控制台版本似乎工作正常我认为可以排除mysql。两个服务器都使用nginx运行PHP fast-cgi。更新到最新版本的PHP并没有解决任何问题。

其他UUID的工作正如这些屏幕截图所示:


XP Server XP Server not working


FreeBSD Server enter image description here

1 个答案:

答案 0 :(得分: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
        )
    );
}

从if语句中删除containsNonPrintableAscii函数可以解决问题。它在我们的开发服务器上运行的原因原因是我的同事提交了添加该功能的初始补丁。 (后来被PhpMyAdmin开发团队摧毁了)