python如何转换mysql二进制(16)
How does python converts mysql binary(16)
我有两个应用程序,一个用 php 编写,一个用 python 编写,它们都使用同样的 mysql 数据库。
对于某些表中的条目的 public id,我使用 binary(16) 字段(我不能更改它,它必须保持这个方式)。
问题是python这个二进制字段是如何转换的?
我们以其中一个条目为例。
当我在 php(从数据库)中获取它时,public id 的值是 °•WiCÄ'õ0Iò|–g, SequelPro 中显示了相同的值。但是 php myAdmin 对二进制字段执行十六进制函数并显示 0bb09557691443c491f53049f27c9667。现在我设法在 php 中将二进制文件转换为 php myAdmin 中显示的值,它适用于所有条目,但我刚刚注意到 python 进行了另一次转换。当我通过 python 获得此示例中使用的条目时,public id 是 owwwweye1rjnvt3i1d0ib18x3。
我需要实现的是在 php 中转换我从 MySql 获得的内容:°•WiCÄ'õ0Iò|–g 到 python看到:owwwweye1rjnvt3i1d0ib18x3。 php 应用程序调用 python 应用程序(不是我开发的),因此 id 需要采用相同的格式才能成功调用。
欢迎提出任何建议。谢谢
编辑:如果我发送 °•WiCÄ'õ0Iò|–g 从 php 到 python 并立即打印我得到: °â€¢WiCÄâ€∼õ0I²|-g
我终于解决了这个问题。
似乎 python 转换为 base36 而不是我错误假设的十六进制。
我尝试简单地 base_convert 0bb09557691443c491f53049f27c9667 从 16 到 36,但我有 owwwweye1rk04k4cskkw4s08s。不是我真正需要的,但仍然是一个很大的进步,因为它开始看起来像 owwwweye1rjnvt3i1d0ib18x3.
由于要转换的值很大(精度损失),我应该会出现这种差异,因此我进一步研究并找到了波纹管函数,由 Clifford dot ct at gmail dot 编写php.net 网站上的 com:
<?php
function str_baseconvert($str, $frombase=10, $tobase=36) {
$str = trim($str);
if (intval($frombase) != 10) {
$len = strlen($str);
$q = 0;
for ($i=0; $i<$len; $i++) {
$r = base_convert($str[$i], $frombase, 10);
$q = bcadd(bcmul($q, $frombase), $r);
}
}
else $q = $str;
if (intval($tobase) != 10) {
$s = '';
while (bccomp($q, '0', 0) > 0) {
$r = intval(bcmod($q, $tobase));
$s = base_convert($r, 10, $tobase) . $s;
$q = bcdiv($q, $tobase, 0);
}
}
else $s = $q;
return $s;
}
?>
我认为其他人不会经常遇到这个问题,但如果发生了,希望他们能找到这个问题,而不是像我一样绞尽脑汁:))))
我有两个应用程序,一个用 php 编写,一个用 python 编写,它们都使用同样的 mysql 数据库。
对于某些表中的条目的 public id,我使用 binary(16) 字段(我不能更改它,它必须保持这个方式)。
问题是python这个二进制字段是如何转换的?
我们以其中一个条目为例。
当我在 php(从数据库)中获取它时,public id 的值是 °•WiCÄ'õ0Iò|–g, SequelPro 中显示了相同的值。但是 php myAdmin 对二进制字段执行十六进制函数并显示 0bb09557691443c491f53049f27c9667。现在我设法在 php 中将二进制文件转换为 php myAdmin 中显示的值,它适用于所有条目,但我刚刚注意到 python 进行了另一次转换。当我通过 python 获得此示例中使用的条目时,public id 是 owwwweye1rjnvt3i1d0ib18x3。
我需要实现的是在 php 中转换我从 MySql 获得的内容:°•WiCÄ'õ0Iò|–g 到 python看到:owwwweye1rjnvt3i1d0ib18x3。 php 应用程序调用 python 应用程序(不是我开发的),因此 id 需要采用相同的格式才能成功调用。
欢迎提出任何建议。谢谢
编辑:如果我发送 °•WiCÄ'õ0Iò|–g 从 php 到 python 并立即打印我得到: °â€¢WiCÄâ€∼õ0I²|-g
我终于解决了这个问题。
似乎 python 转换为 base36 而不是我错误假设的十六进制。
我尝试简单地 base_convert 0bb09557691443c491f53049f27c9667 从 16 到 36,但我有 owwwweye1rk04k4cskkw4s08s。不是我真正需要的,但仍然是一个很大的进步,因为它开始看起来像 owwwweye1rjnvt3i1d0ib18x3.
由于要转换的值很大(精度损失),我应该会出现这种差异,因此我进一步研究并找到了波纹管函数,由 Clifford dot ct at gmail dot 编写php.net 网站上的 com:
<?php
function str_baseconvert($str, $frombase=10, $tobase=36) {
$str = trim($str);
if (intval($frombase) != 10) {
$len = strlen($str);
$q = 0;
for ($i=0; $i<$len; $i++) {
$r = base_convert($str[$i], $frombase, 10);
$q = bcadd(bcmul($q, $frombase), $r);
}
}
else $q = $str;
if (intval($tobase) != 10) {
$s = '';
while (bccomp($q, '0', 0) > 0) {
$r = intval(bcmod($q, $tobase));
$s = base_convert($r, 10, $tobase) . $s;
$q = bcdiv($q, $tobase, 0);
}
}
else $s = $q;
return $s;
}
?>
我认为其他人不会经常遇到这个问题,但如果发生了,希望他们能找到这个问题,而不是像我一样绞尽脑汁:))))