文章目錄

关于mysql中字符串转换成布尔类型数据

先看一下php中布尔类型的转换。http://php.net/manual/zh/language.types.boolean.php

转换为布尔值 

要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换。但是很多情况下不需要用强制转换,因为当运算符,函数或者流程控制结构需要一个 boolean 参数时,该值会被自动转换。

参见类型转换的判别。

当转换为 boolean 时,以下值被认为是 FALSE:

布尔值 FALSE 本身
整型值 0(零)
浮点型值 0.0(零)
空字符串,以及字符串 "0"
不包括任何元素的数组
不包括任何成员变量的对象(仅 PHP 4.0 适用)
特殊类型 NULL(包括尚未赋值的变量)
从空标记生成的 SimpleXML 对象
所有其它值都被认为是 TRUE(包括任何资源)。

Warning
-1 和其它非零值(不论正负)一样,被认为是 TRUE!
<?php
var_dump((bool) "");        // bool(false)
var_dump((bool) 1);         // bool(true)
var_dump((bool) -2);        // bool(true)
var_dump((bool) "foo");     // bool(true)
var_dump((bool) 2.3e5);     // bool(true)
var_dump((bool) array(12)); // bool(true)
var_dump((bool) array());   // bool(false)
var_dump((bool) "false");   // bool(true)
?>

在php中,字符串转换成布尔类型是true,负数值只要是非零的值也都是ture。

但是在mysql中是没有bool类型的http://stackoverflow.com/questions/4753963/whats-the-difference-between-mysql-bool-and-boolean-column-data-types ,虽然可以使用bool指定数据类型,但实际存储的时候使用的是tinyint。测试过程:
使用以下语句创建表。

create table xs
(
   id int primary key,
   bl boolean
)

查看表结构,bl的类型自动变成了tinyint(1)

mysql

所以在mysql中,当需要进行一些布尔类型的运算,把数据类型进行转换的时候跟php的结果也有些不一样。比如:

select 'a' or 0;

在php中,字符串转换成bool是true, true or 0 结果应该是true。但是在mysql里,这个结果是false。

mysql

在进行了多次测试之后发现,并不是字符串转换成bool之后都是false。其实前面说到了,mysql中是没有bool类型的。只有tinytint。所以在进行逻辑运算之前,字符串是转换成了tinyint类型,然后进行的运算。当然这是我的一个猜想。实际测试的结果是跟这个想法吻合的。比如:

select if('aaaa','true','false');  输出false
select if('0029922aaaa','true','false');  输出true,字符串先转换成数字
select if('-00029922aaaa','true','false');  输出true

mysql
mysql
mysql

文章目錄