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

Posted

技术标签:

【中文标题】在不同操作系统上处理 MySQL 的 BIT 数据类型【英文标题】:Treating MySQL's BIT datatype on different OS 【发布时间】:2016-01-15 06:07:59 【问题描述】:

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

【问题讨论】:

试试这个INSERT INTO tab1 (bit_field) values (b?),你可以绑定boolean或者int值。 赞这个***.com/a/36762564/5559741 您可能希望包含用于从数据库中保存和检索内容的代码。 PHP 的类型非常松散,所以仅仅因为您将某些内容设置为整数并不意味着它会以这种方式传递给数据库。 【参考方案1】:

您需要使用PHP函数bindecdecbin

显示代码

//linux OR windows
$display = bindec($value_from_db);

保存代码

//both platforms
$value_for_db = decbin($display);

【讨论】:

感谢您的帮助!它在linux上运行得很好,在windows上我只有保存问题。我收到22001 SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 嗨,Matías,您能提供表结构来调试问题吗?我的意思是 `SHOW CREATE TABLE your_table_name` SQL 命令的输出。 我已经升级了 PHP 版本,现在一切正常。谢谢!【参考方案2】:

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'

     SELECT CAST(bitfield AS unsigned int)

【讨论】:

按照 Luigi 的建议使用 bindec(),解决了显示问题,现在我无法在 Windows 上保存值(请参阅我在 Luigi 的回答中的评论) @Matías,我以为你已经解决了问题,正如你所说,`我最终在 Windows 和 Linux 上都这样做了,而且效果很好`。如果还有问题,请参考这个页面,dev.mysql.com/doc/refman/5.7/en/bit-field-literals.html 您应该在保存数据时在查询中尝试(bitfield AS unsigned) 是的,问题解决了。但我正在尝试使用“通用”方法,而不是使用基于操作系统的代码 我正在使用相同的 windows 配置并且将位转换为 int 正在工作。此外,Miken32 有一点。

以上是关于在不同操作系统上处理 MySQL 的 BIT 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

64bit到底是啥?操作系统和cpu都在说64bit,但我不了解这到底是啥。

为啥 MySQL BIT_OR() 返回的值与 PHP 位运算不同

64bit和32bit的处理器有啥区别?

“mysql”的存储类型“bit”是啥?

Java之IO

MySQL之架构与历史