MySQL BOOL/BOOLEAN 与 TINYINT 测试总结

fmms 12年前
     <p>【<strong>导读</strong>】</p>    <p>MySQL数据库产品提供了二种比较特殊的数据类型: SET(集合类型)、ENUM(枚举类型)、BOOL/BOOLEAN(布尔类型),而多数开发人员,甚至DBA从业者对如何使用这三种数据类型的应用场 景并不十分清晰,为此结合TINYINT数据类型对比,让我们大家一起弄清楚。</p>    <p><strong>(一)   </strong><strong>数据类型测试</strong><strong> </strong></p>    <p>(1). <strong>布尔类型</strong><strong>BOOL/BOOLEAN </strong><strong>与</strong><strong> </strong><strong>微整型</strong><strong>TINYINT</strong></p>    <p><span style="font-family:courier new,courier;"><strong>a). </strong><strong>创建测试表结构</strong><strong> </strong></span></p>    <p><span style="font-family:courier new,courier;color:#000080;">root@localhost : test 05:12:49> CREATE TABLE boolean_test(ID INT NOT NULL AUTO_INCREMENT,</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">    ->                           Online_Flag BOOL,</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">    ->                           Lock_Flag BOOLEAN,</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">    ->                           PRIMARY KEY(ID)</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">    ->                           )ENGINE=InnoDB CHARACTER SET ‘utf8′ COLLATE ‘utf8_general_ci’;</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">Query OK, 0 rows affected (0.01 sec)</span></p>    <p> </p>    <p>我们可以发现对于字段类型写成BOOL或者BOOLEAN,MySQL的SQL语法都是允许通过的,另外我们再通过SHOW命令查阅创建好的表结构:</p>    <p><span style="font-family:courier new,courier;color:#000080;">*************************** 1. row ***************************</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">       Table: boolean_test</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">Create Table: CREATE TABLE `boolean_test` (</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">  `ID` int(11) NOT NULL AUTO_INCREMENT,</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">  `Online_Flag` tinyint(1) DEFAULT NULL,</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">  `Lock_Flag` tinyint(1) DEFAULT NULL,</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">  PRIMARY KEY (`ID`)</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">1 row in set (0.00 sec)</span></p>    <p><strong>小结:</strong></p>    <p>我们对比手工输入创建表boolean_test的结构定义与数据库中查阅到表结构定义,可以发现二者的差别:</p>    <ol>     <li>MySQL数据库将字段的数据类型BOOL/BOOLEAN默认地转换成TINYINT(1);</li>     <li>MySQL数据库自动完成的数据类型转换过程,没有给出任何错误或警告信息提示;</li>    </ol>    <p><strong>b). </strong><strong>测试数据的写入</strong></p>    <p><span style="font-family:courier new,courier;color:#000080;">root@localhost : test 05:12:58> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(TRUE,FALSE);</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">Query OK, 1 row affected (0.00 sec)</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">root@localhost : test 05:13:58> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(1,0);</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">Query OK, 1 row affected (0.00 sec)</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">root@localhost : test 05:14:04> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(2,-1);</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">Query OK, 1 row affected (0.00 sec)</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">root@localhost : test 05:14:11> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(-128,127);</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">Query OK, 1 row affected (0.00 sec)</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">root@localhost : test 05:14:18> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(-256,256);</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">Query OK, 1 row affected, 2 warnings (0.00 sec)</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">root@localhost : test 05:14:24> SHOW WARNINGS;</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">+———+——+——————————————————+</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">| Level   | Code | Message                                              |</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">+———+——+——————————————————+</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">| Warning | 1264 | Out of range value for column ‘Online_Flag’ at row 1 |</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">| Warning | 1264 | Out of range value for column ‘Lock_Flag’ at row 1   |</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">+———+——+——————————————————+</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">2 rows in set (0.00 sec)</span></p>    <p><strong>小结:</strong></p>    <ol>     <li>测试数据表boolean_test的2个字段布尔类型字段,写入的值超过有符号整型TINYINT数据类型存储范围时,出现了字段值截断的警告信息;</li>     <li>向测试数据表boolean_test的字段可以写入表达布尔数值的TRUE 或 FALSE是不会报错,也不需要用单引号或双引号括起来;</li>     <li>向测试数据表boolean_test的字段可以写入非表达布尔类型的数值,MySQL数据库不会有任何错误或警告信息提示;</li>    </ol>    <p><strong>c). </strong><strong>显示写入表</strong><strong>boolean_test</strong><strong>的数据</strong></p>    <p><span style="font-family:courier new,courier;color:#000080;">root@localhost : test 06:31:33> SELECT * FROM boolean_test;</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">+—-+————-+———–+</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">| ID | Online_Flag | Lock_Flag |</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">+—-+————-+———–+</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">|  1 |           1 |         0 |</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">|  2 |           1 |         0 |</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">|  3 |           2 |        -1 |</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">|  4 |        -128 |       127 |</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">|  5 |        -128 |       127 |</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">+—-+————-+———–+</span></p>    <p><span style="font-family:courier new,courier;color:#000080;">5 rows in set (0.00 sec)</span></p>    <p><strong>小结:</strong></p>    <p>通过查阅测试表boolean_test的数据,可以发现MySQL数据库中存储的值与数据写入的INSERT语句还是有一些差别,体现在:</p>    <ol>     <li>写入的布尔类型值TRUE 转换成了 1,FALSE 转换成了 0;</li>     <li>超过TINYINT数据类型存储的上下限制的值,被自动截断;</li>     <li>布尔类型BOOL/BOOLEAN的功能等同于微整型TINYTINT;</li>    </ol> 本文转载自: http://www.mysqlops.com/2012/03/15/mysql-boolean-tinyint.html