【问题标题】:MySQL Boolean TypeMySQL 布尔类型
【发布时间】:2013-04-15 17:38:36
【问题描述】:

我真的很纠结如何处理这个问题。在过去的 10 年里,我一直在忍受这个问题,但我认为是时候决定处理这个问题的正确方法了。

根据互联网,MySQL 不支持本机数据类型,这是有道理的,为什么每当我选择“BOOLEAN”时,我都会看到该列以 tinyint(1) 结尾。

我将数据存储为具有 1 或 0 值的 tinyint 没有问题,但是我确实有一个问题,即当我使用该列从数据库中选择许多行时,我得到一个字符串“1”或“ 0" 而不是 PHP 原生 bool true/false。 PHP 当然仍然可以将此变量作为布尔值处理,因为它似乎自动知道我想要它做什么,只要我做 == 0 或 == 1 甚至 == '0' 或 == '1' 如果我我真的觉得可以。

所以,我开始了,获取这些数据并将其运行到 PHP 的 json_encode 函数中,并在我的 Backbone/Handlebars 实现进行 ajax 调用时输出它,并获得一个漂亮漂亮的 JSON 对象(通常在其中包含许多行的数据它)用这个:{"myVariable":"1"} 或这个{"myVariable":"0"}

我相信您可以在 Handlebars.js 中看到想要做这样的事情的问题:

{{#if myVariable}} 
    Do this
{{else}}
    Do that
{{/if}}

现在,我真正不想做的是这样的事情:

<?php
for($i = 0; $i < count($recordSet); $i++) {
    $recordSet[$i]['myVariable'] = (bool)$recordSet[$i]['myVariable'];
}
?>

由于我正在构建的应用程序在数据库中有数千列,因此我不能(或应该只需要)为我想要在我的 javascript 中像 bool 一样运行的每一列运行上述代码。而且我真的不想这样做(尽管这可能是最简单的)

Handlebars.registerHelper('ifTrue', function(a, b) {
    // Cast the compared value to a bool and then run a regular handlebars #if statement
});

有没有更好的方法?我正在使用代码点火器...可以以某种方式修改数据库类以检测 tinyint(1) 列并自动将其转换为布尔值,然后执行此操作直到 MySQL 支持真正的布尔值列?我知道他们正在计划,但是...

【问题讨论】:

  • 这对于使用什么数据类型来说是一个很好的解决方案,但是它并没有完全回答如何有效地从查询中获取纯 PHP 真/假值,它更多地概述了哪些数据类型存储价值。无论我使用的是 BIT 还是 tinyint(1),当通过 json_encode 运行查询结果时,返回字符串“1”或“0”时,同样的问题仍然存在。
  • select &lt;columns&gt;, CASE blnColumn WHEN '0' THEN 'FALSE' WHEN '1' THEN 'TRUE' - dreamincode.net/forums/topic/…
  • 否则,您始终可以将 myVariable 转换为数字客户端。类似于:{{#if +myVariable}}。
  • tinyint(1) 应该可以很好地满足您的目的。只要您在客户端正确解码 json 对象(更多关于 zeros 和 js:stackoverflow.com/questions/7615214/…,即可使用 PHP 和 javascript true/false 语法

标签: php mysql codeigniter handlebars.js


【解决方案1】:

请记住,默认情况下,PHP/MySQL 驱动程序返回的列值只是字符串(即无类型的字节数组)。这个简短的 sn-p 演示了它:

// mysqli driver
$c = mysqli_connect ($host, $user, $pass, $dbname);
$r = mysqli_query($c, 'SELECT * FROM foo');
$f = mysqli_fetch_array($r);
foreach ($f as $k => $v) {
    echo "$k => $v [" . gettype($v) . ']' . PHP_EOL;
}

// PDO
$c = new PDO("mysql:dbname=$dbname;host=$host", $user, $pass);
$r = $c->query('SELECT * FROM foo');
$f = $r->fetch();
foreach ($f as $k => $v) {
    echo "$k => $v [" . gettype($v) . ']' . PHP_EOL;
}

“默认”,因为可以为驱动程序提供一个映射,以便它可以将这些字符串转换为原生 PHP 类型。为此,mysqli 具有 mysqli_result::fetch_object()PDO 具有 PDOStatement::fetchObject()

虽然可以从元数据甚至表定义中检索实际列类型,但在典型情况下,客户端应用程序会提前知道。

底线是:您确实想要这样做(或类似的事情):

$recordSet[$i]['myBoolColumn'] = (bool)$recordSet[$i]['myBoolColumn'];

...因为事实上你也应该这样做:

$recordSet[$i]['myIntColumn'] = (int)$recordSet[$i]['myIntColumn'];

但是 PHP 在输入方面非常宽松,毕竟我不会太担心这一点。

【讨论】:

    猜你喜欢
    • 2023-02-06
    • 1970-01-01
    • 2017-10-15
    • 2018-02-27
    • 1970-01-01
    • 2010-09-13
    • 2010-09-22
    相关资源
    最近更新 更多