在使用PHP和PDO的Windows环境中使用MySQL的BIT数据类型时没有任何问题。我使用的唯一技巧是将其转换为int。
但是当我将代码上传到Linux服务器时,我无法看到那些BIT值:我得到了一个方形字符。
在搜索完这个之后,我发现了Marc B的this answer,再加上Stanimir Stoyanov的评论,我最终为Windows和Linux做了这个,而且工作得很好
显示代码
//linux OR windows
$display = ($value_from_db === chr(0x01) || $value_from_db == 1) ? 1 : 0;
保存代码
//both platforms
$value_for_db = ($display == 1) ? 0x01 : 0x00;
所以我的问题是:
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 :(得分:2)
您需要使用PHP函数bindec
和decbin
:
显示代码
//linux OR windows
$display = bindec($value_from_db);
保存代码
//both platforms
$value_for_db = decbin($display);
答案 1 :(得分:1)
BIT
不是单个位,而是固定宽度的位字段值,范围从1到64.存储在此数据类型的列中的值存储为BINARY
。许多客户端库,命令行客户端和其他GUI客户端不知道如何处理此值。它也作为BINARY值传输。它的显示方式取决于列的宽度。例如,如果列为32位宽,则将其视为CHAR(4)
,如果为8位宽,则将其视为CHAR(1)
。这就是为什么您需要将其转换为INTEGER
值才能正确显示它。
对于Microsoft SQL Server,BIT是一个单比特列,并作为INTEGER
数据类型中的单个位存储。
您也可以尝试BOOL
或BOOLEAN
数据类型。这些数据类型类似于TINYINT(1)
,它可以存储0和1以外的值。TINYINT(1)
将使用完整字节,但BIT(1)
也会执行相同的操作。根据此page,零值被视为假,非零值被视为真。所以,你给它赋值2,它将被认为是真的。因此,如果您只想允许0和1,那么您应该使用BIT
并转换值以正确显示它。
根据这个page,应该在显示之前将BIT字段强制转换为INT。为此,请参阅此link,尝试以下操作。
$bitvalue = ($bitvalue == 0x01) ? 'TRUE' : 'FALSE'
OR
SELECT CAST(bitfield AS unsigned int)