关于mysql中字符串转换成布尔类型数据
文章目錄
关于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中,当需要进行一些布尔类型的运算,把数据类型进行转换的时候跟php的结果也有些不一样。比如:
select 'a' or 0;
在php中,字符串转换成bool是true, true or 0 结果应该是true。但是在mysql里,这个结果是false。
在进行了多次测试之后发现,并不是字符串转换成bool之后都是false。其实前面说到了,mysql中是没有bool类型的。只有tinytint。所以在进行逻辑运算之前,字符串是转换成了tinyint类型,然后进行的运算。当然这是我的一个猜想。实际测试的结果是跟这个想法吻合的。比如:
select if('aaaa','true','false'); 输出false
select if('0029922aaaa','true','false'); 输出true,字符串先转换成数字
select if('-00029922aaaa','true','false'); 输出true