处理不同操作系统上MySQL的BIT数据类型
处理不同操作系统上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
在处理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提出了一个观点。
问题的出现原因:
在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版本,现在一切都正常工作了。谢谢!