处理不同操作系统上MySQL的BIT数据类型

13 浏览
0 Comments

处理不同操作系统上MySQL的BIT数据类型

在Windows环境下使用PHP和PDO与MySQL的BIT数据类型合作没有任何问题。唯一的技巧是将其转换为int类型。

但是当我把代码上传到Linux服务器后,我无法看到这些BIT值:我得到了一个方块字符。

在搜索了这个问题之后,我发现了Marc B的这个答案,结合了Stanimir Stoyanov的评论,我最终在Windows和Linux上都采用了这种解决方法,效果非常好。

显示的代码

//Linux或Windows
$display = ($value_from_db === chr(0x01) || $value_from_db == 1) ? 1 : 0;

保存的代码

//两个平台都适用
$value_for_db = ($display == 1) ? 0x01 : 0x00;

所以我的问题是:

  • 这两个平台确实以不同的方式处理这种数据类型吗?
  • 还是这是一个特定的程序问题?(php、apache、mysql)
  • 这种解决方法是正确的吗?或许还有其他方法

Windows 7:PHP 5.6.10,Apache 2.4.12,MySQL 5.6.26

Debian Wheezy:PHP 5.5.30,Apache 2.2.22,MySQL 5.6.25

0
0 Comments

在处理MySQL的BIT数据类型时出现问题的原因是,BIT实际上不是一个单独的位,而是一个固定宽度的位域值,范围从1到64。存储在此数据类型列中的值以BINARY形式存储。许多客户端库、命令行客户端和其他图形用户界面客户端不知道如何处理这个值。它也以BINARY值传输。它的显示方式取决于列的宽度。例如,如果列宽为32位,则它被视为CHAR(4),如果列宽为8位,则被视为CHAR(1)。因此,为了正确显示它,您需要将其转换为整数值。

在Microsoft SQL Server中,BIT是一个单比特列,存储为INTEGER数据类型中的单个比特。

您也可以尝试使用BOOL或BOOLEAN数据类型。这些数据类型类似于TINYINT(1),可以存储0和1以外的值。TINYINT(1)将占用一个完整字节,而BIT(1)也是如此。根据这个页面,零值被视为false,非零值被视为true。因此,如果您给它赋值为2,它将被视为true。因此,如果您只想允许0和1,那么应该使用BIT并将值转换为显示它。

根据这个页面,应该在显示BIT字段之前将其转换为INT。根据这个链接的参考,可以尝试以下操作。

$bitvalue = ($bitvalue == 0x01) ? 'TRUE' : 'FALSE';

或者

SELECT CAST(bitfield AS unsigned int);

使用像Luigi建议的bindec()解决了显示问题,现在我在Windows上保存值时遇到了问题(请参见我在Luigi的答案中的评论)。

我以为你已经解决了这个问题,因为你说过“我最终在Windows和Linux上都这样做了,效果很好”。如果仍然有问题,你应该参考这个页面http://dev.mysql.com/doc/refman/5.7/en/bit-field-literals.html。

在保存数据时,您应该在查询中尝试(bitfield AS unsigned)。

是的,问题已经解决了。但是我正在尝试使用“通用”方法,而不是基于操作系统的代码。

我正在使用与Windows相同的配置,并且将bit转换为int是有效的。此外,Miken32提出了一个观点。

0
0 Comments

问题的出现原因:

在Windows操作系统上保存数据时出现了问题,错误提示为“22001 SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column”。

解决方法:

1. 使用PHP函数`bindec`和`decbin`进行处理:

- 在Linux和Windows上进行显示时,使用`bindec`函数将数据库中的值转换为二进制。

- 在保存数据时,使用`decbin`函数将显示的值转换为二进制,并存储在数据库中。

2. 升级PHP版本:

- 尝试升级PHP版本,可能可以解决保存数据时出现的问题。

以下为具体代码和对话:

// Linux 或 Windows 平台上的显示代码
$display = bindec($value_from_db);
// 通用的保存代码
$value_for_db = decbin($display);

问题解决的对话内容:

用户:谢谢你的帮助!在Linux上运行得非常好,但在Windows上保存时出现了问题。我收到了一个错误提示:“22001 SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column”。
Matías:嗨,Matías,请提供表结构以便调试问题。我是说“SHOW CREATE TABLE your_table_name”SQL命令的输出。
用户:我已经升级了PHP版本,现在一切都正常工作了。谢谢!

0