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

时间:2015-10-16 13:07:16

标签: php mysql linux windows type-conversion

在使用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;

所以我的问题是:

  • 两个平台是否确实以不同方式处理此数据类型?
  • 或者它是一个特定的程序问题? (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

2 个答案:

答案 0 :(得分:2)

您需要使用PHP函数bindecdecbin

显示代码

//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数据类型中的单个位存储。

您也可以尝试BOOLBOOLEAN数据类型。这些数据类型类似于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)