【问题标题】:MySQL UNHEX function showing unexpected results in phpmyadminMySQL UNHEX 函数在 phpmyadmin 中显示意外结果
【发布时间】:2013-04-19 14:07:04
【问题描述】:

对于我的所有项目,我对数据库中的 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 服务器


FreeBSD 服务器

【问题讨论】:

  • 我发现 HeidiSQL 使用 PHPMyAdmin 更容易
  • 我也是,但数据库运行在与我当前工作不同的 PC 上。而且我认为我没有办法连接到服务器。不过感谢您的提示,HeidiSQL 非常棒。
  • 看到 +Options 链接了吗?展开它以查看它们是什么。
  • 和他们一起玩,显示二进制为十六进制选项被选中。
  • @TFennis - 我一直连接到远程 MySQL 服务器。

标签: mysql phpmyadmin


【解决方案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 开发团队销毁)

【讨论】:

    猜你喜欢
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2015-11-17
    • 1970-01-01
    • 2015-08-31
    相关资源
    最近更新 更多