gpt4 book ai didi

php - 使用 PHP7 MySQLi 准备语句将 BIT(M) 列值插入 MySQL5.7

转载 作者:行者123 更新时间:2023-11-29 18:21:34 28 4
gpt4 key购买 nike

当尝试使用 MySQLi 准备好的语句将值插入 BIT(64) 列时,我收到错误(执行时):

Data too long for column 'bits64' at row 1

这是我的代码:

if ($Segments[0] == 'yes') {$bitmask = '1';}else{$bitmask = '0';}
if ($Segments[1] == 'yes') {$bitmask = $bitmask.'1';}else{$bitmask = $bitmask.'0';}
...
if ($Segments[63] == 'yes') {$bitmask = $bitmask.'1';}else{$bitmask = $bitmask.'0';}

$Upload = $conn->prepare("INSERT INTO `testtable` (`bits64`) VALUES (?)");
$Upload->bind_param("s", $bitmask);
$Upload->execute();

该代码提供 64 个字符的字符串。如果我使用 PHPMyAdmin 插入相同的输出,它会成功运行,如下所示:

INSERT INTO `testtable` (`bits64`) VALUES (b'0000000000000000000000000000000000000000000000000000000000000000');
INSERT INTO `testtable` (`bits64`) VALUES (b'1111111111111111111111111111111111111111111111111111111111111111');

唯一显示出“成功”(*不是真正成功)的是将绑定(bind)类型更改为整数。但它似乎被视为应该转换为二进制的整数,因为它在位标志设置为 1 时给出了相同的错误。 .

我尝试过的其他事情包括格式化 $bitmask如:

$bitmask = "b'".$bitmask."'";
$bitmask = "0b".$bitmask;
// And others

据我所知,bind_param 类型仅有整数、字符串、 double 和 blob。我假设它正在发送类似 '101010' 的值(代码示例),101010 (作为整数),'b'101010'' ,和'0b101010' , 恭敬地;然而,需要的是 b'101010'

出于(其他领域的)速度和安全原因,我必须使用准备好的语句。

我最初为此使用了 BIGINT,但在设置大多数标志时似乎出现了舍入错误。

我想我禁用了 MySQL 严格模式。

我的后备方案是使用大量 TINYINT 列或 CHAR(64),但我更喜欢更高效的存储。

该网站上有一些相关问题,但大多数与单位字段相关,其中整数 0 或 1 更容易与单位相关。我应该非常感谢任何建议或解决方案。

编辑

我意识到我的 SQL 模式并不是完全空白的。一旦 SQL 模式为空字符串,就没有错误,但我得到 0111111111111111111111111111111111111111111111111111111111111111无论我尝试什么。

编辑2

通过 phpMyAdmin 插入并设置所有 1 个标志也会给出 0111111111111111111111111111111111111111111111111111111111111111 ,所以我配置此列的方式肯定还有其他问题。我使用的是 Ubuntu 16.04,服务器版本:5.7.19,PHP 版本:7.0.22。

最佳答案

这是绑定(bind)类型很重要的示例之一......但对您的情况没有真正帮助。

您需要了解您真正使用的数据类型。您已在 PHP 中创建了一串数字。这不是一个二进制数!它只是一个字符串。 PHP 可以处理它并强制转换它,但是您需要使用 PHP 明确表示您想要的是数字,而不是字符串。

一种方法是:

$bitmask = bindec($bitmask); // convert binary string to decimal number

$Upload = $conn->prepare("INSERT INTO `testtable` (`bits64`) VALUES (?)");
$Upload->bind_param("i", $bitmask); // bind as integer
$Upload->execute();

如果您想避免绑定(bind)为整数,可以使用 VALUES(CAST(? AS UNSIGNED)) 在 SQL 中对其进行转换,或者简单地添加 0,例如值(? + 0)

为了避免使用 bindec(),您可以在 PHP 中使用按位运算。该值将始终是整数。

关于php - 使用 PHP7 MySQLi 准备语句将 BIT(M) 列值插入 MySQL5.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46531661/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com