zoukankan      html  css  js  c++  java
  • MySQL数据库之数据类型BOOL/BOOLEAN与TINYINT测试总结

    From: http://database.51cto.com/art/201203/323863.htm

    网络上很多人咨询mysql是否提供布尔类型?MySQL数据库确实提供布尔类型,此数据类型的关键字可以写成:布尔类型BOOL或布尔类型BOOLEAN,但是MySQL数据库数据类型的布尔类型是否也像其他数据库产品一样呢?本文揭开mysql布尔类型的真实面目。

    AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验

    【导读】

    网络上很多人咨询mysql是否提供布尔类型?MySQL数据库确实提供布尔类型,此数据类型的关键字可以写成:布尔类型BOOL或布尔类型BOOLEAN,但是MySQL数据库数据类型的布尔类型是否也像其他数据库产品一样呢?本文揭开mysql布尔类型的真实面目。

    (一) 数据类型测试

    (1). 布尔类型BOOL/BOOLEAN 与 微整型TINYINT

    a). 创建测试表结构

    1. root@localhost : test 05:12:49> CREATE TABLE boolean_test(ID INT NOT NULL AUTO_INCREMENT,  
    2.    
    3.     ->                           Online_Flag BOOL,  
    4.    
    5.     ->                           Lock_Flag BOOLEAN,  
    6.    
    7.     ->                           PRIMARY KEY(ID)  
    8.    
    9.     ->                           )ENGINE=InnoDB CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';  
    10.    
    11. Query OK, 0 rows affected (0.01 sec) 

    我们可以发现对于字段类型写成BOOL或者BOOLEAN,MySQL的SQL语法都是允许通过的,另外我们再通过SHOW命令查阅创建好的表结构:

    1. *************************** 1. row ***************************  
    2.    
    3.        Table: boolean_test  
    4.    
    5. Create Table: CREATE TABLE `boolean_test` (  
    6.    
    7.   `ID` int(11) NOT NULL AUTO_INCREMENT,  
    8.    
    9.   `Online_Flag` tinyint(1) DEFAULT NULL,  
    10.    
    11.   `Lock_Flag` tinyint(1) DEFAULT NULL,  
    12.    
    13.   PRIMARY KEY (`ID`)  
    14.    
    15. ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8  
    16.    
    17. 1 row in set (0.00 sec) 

    小结:

    我们对比手工输入创建表boolean_test的结构定义与数据库中查阅到表结构定义,可以发现二者的差别:

    • MySQL数据库将字段的数据类型BOOL/BOOLEAN默认地转换成TINYINT(1);
    • MySQL数据库自动完成的数据类型转换过程,没有给出任何错误或警告信息提示;

    b). 测试数据的写入

    1. root@localhost : test 05:12:58> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(TRUE,FALSE);  
    2.    
    3. Query OK, 1 row affected (0.00 sec)  
    4.    
    5. root@localhost : test 05:13:58> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(1,0);  
    6.    
    7. Query OK, 1 row affected (0.00 sec)  
    8.    
    9. root@localhost : test 05:14:04> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(2,-1);  
    10.    
    11. Query OK, 1 row affected (0.00 sec)  
    12.    
    13. root@localhost : test 05:14:11> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(-128,127);  
    14.    
    15. Query OK, 1 row affected (0.00 sec) 
    1. root@localhost : test 05:14:18> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(-256,256);  
    2.    
    3. Query OK, 1 row affected, 2 warnings (0.00 sec)  
    4.    
    5. root@localhost : test 05:14:24> SHOW WARNINGS;  
    6.    
    7. +---------+------+------------------------------------------------------+  
    8.    
    9. Level   | Code | Message                                              |  
    10.    
    11. +---------+------+------------------------------------------------------+  
    12.    
    13. | Warning | 1264 | Out of range value for column 'Online_Flag' at row 1 |  
    14.    
    15. | Warning | 1264 | Out of range value for column 'Lock_Flag' at row 1   |  
    16.    
    17. +---------+------+------------------------------------------------------+  
    18.    
    19. rows in set (0.00 sec) 

    小结:

    • 测试数据表boolean_test的2个字段布尔类型字段,写入的值超过有符号整型TINYINT数据类型存储范围时,出现了字段值截断的警告信息;
    • 向测试数据表boolean_test的字段可以写入表达布尔数值的TRUE 或 FALSE是不会报错,也不需要用单引号或双引号括起来;
    • 向测试数据表boolean_test的字段可以写入非表达布尔类型的数值,MySQL数据库不会有任何错误或警告信息提示;

    c). 显示写入表boolean_test的数据

    1. root@localhost : test 06:31:33> SELECT * FROM boolean_test;  
    2.    
    3. +----+-------------+-----------+  
    4.    
    5. | ID | Online_Flag | Lock_Flag |  
    6.    
    7. +----+-------------+-----------+  
    8.    
    9. |  1 |           1 |         0 |  
    10.    
    11. |  2 |           1 |         0 |  
    12.    
    13. |  3 |           2 |        -1 |  
    14.    
    15. |  4 |        -128 |       127 |  
    16.    
    17. |  5 |        -128 |       127 |  
    18.    
    19. +----+-------------+-----------+  
    20.    
    21. rows in set (0.00 sec) 

    小结:

    通过查阅测试表boolean_test的数据,可以发现MySQL数据库中存储的值与数据写入的INSERT语句还是有一些差别,体现在:

    • 写入的布尔类型值TRUE 转换成了 1,FALSE 转换成了 0;
    • 超过TINYINT数据类型存储的上下限制的值,被自动截断;
    • 布尔类型BOOL/BOOLEAN的功能等同于微整型TINYTINT;

    原文链接:http://www.mysqlops.com/2012/03/15/mysql-boolean-tinyint.html

    【编辑推荐】

    1. MySQL源码学习:MDL字典锁
    2. MySQL Cluster开发环境简明部署
    3. MySQL的四种不同查询的分析
    4. MySQL的四种不同查询的分析
    5. MySQL内存表的特性与使用介绍
  • 相关阅读:
    UVALive 5983 MAGRID DP
    2015暑假训练(UVALive 5983
    poj 1426 Find The Multiple (BFS)
    poj 3126 Prime Path (BFS)
    poj 2251 Dungeon Master 3维bfs(水水)
    poj 3278 catch that cow BFS(基础水)
    poj3083 Children of the Candy Corn BFS&&DFS
    BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)
    洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
    洛谷P3065 [USACO12DEC]第一!First!(Trie树+拓扑排序)
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/5899207.html
Copyright © 2011-2022 走看看