数据库第二阶段,BOOLEAN与TINYINT测试总结

(一) 数据类型测试

boolean类型
MYSQL保存BOOLEAN值时用1代表TRUE,0代表FALSE,boolean在MySQL里的类型为tinyint(1),
MySQL里有四个常量:true,false,TRUE,FALSE,它们分别代表1,0,1,0,
mysql> select true,false,TRUE,FALSE;
+——+——-+——+——-+
| TRUE | FALSE | TRUE | FALSE |
+——+——-+——+——-+
|    1 |     0 |    1 |     0 |
+——+——-+——+——-+
可以如下插入boolean值:insert into [xxxx(xx)]
values(true),当然也可以values(1);
举例如下:
mysql> alter table test add isOk boolean;
Query OK
mysql> desc test;
+——-+————-+——+—–+———+—————-+
| Field | Type        | Null | Key | Default | Extra          |
+——-+————-+——+—–+———+—————-+
数据库,| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| isOk  | tinyint(1)  | YES  |     | NULL    |                |
+——-+————-+——+—–+———+—————-+
mysql> insert into test(isOk) values(true);
Query OK
mysql> select isOk from test ;
+——+
| isOk |
+——+
|    1 |

 

[email protected] : test 05:12:49> CREATE TABLE boolean_test(ID INT NOT NULL AUTO_INCREMENT,         ->                           Online_Flag BOOL,         ->                           Lock_Flag BOOLEAN,         ->                           PRIMARY KEY(ID)         ->                           )ENGINE=InnoDB CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';     Query OK, 0 rows affected (0.01 sec) 

+——+

 MySQL没有boolean类型。这也是比较奇怪的现象。例:

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

这样是可以创建成功,但查看一下建表后的语句,就会发现,mysql把它替换成tinyint(1)。也就是说mysql把boolean=tinyInt了,但POJO类要定义成什么类型呢?
因为惯性思维,在java类中也把它定义成type。然后在Struts中使用<s:check/>标签。这就产生一个严重的问题了。<s:check>是boolean,而POJO去定义成byte。这样数据永远也无法提交,被struts的intercept拦截掉了。解决办法是在POJO类中定义成boolean,在mysql中定义成tinyint(1)。

 


 TINYINT(1) or ENUM( ‘true’ , ‘false’)


 

[email protected] : test 06:31:33> SELECT * FROM boolean_test;     +----+-------------+-----------+     | ID | Online_Flag | Lock_Flag |     +----+-------------+-----------+     |  1 |           1 |         0 |     |  2 |           1 |         0 |     |  3 |           2 |        -1 |     |  4 |        -128 |       127 |     |  5 |        -128 |       127 |     +----+-------------+-----------+     5 rows in set (0.00 sec) 

注意:当需要输入中文的时候,需要临时转换客户端的编码方式:SET NAMES
GBK;这个转换只针对当前连接有效,而且是在输入以上命令以后有效。

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

创建数据库:(创建一个数据库相当于在磁盘总创建了一个目录)
CREATE
{DATABASE | SCHEMA} [IF NOT EXISTS] db_name [[DEFAULT] CHARACTER
SET[=]charset_name]

小结:

建表时多个字段间,以逗号分隔。

a). 创建测试表结构

删除指定的数据库:DROP
{DATABASE} [IF EXISTS] db_name;

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

 

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

 

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

 

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

mysql语句的编码规范:关键字与函数名称全部大写;数据库名称,表名称,字段名称等全部小写;sql语句必须以分隔符结尾;sql语句支持折行操作,只要不把单词、标记和引号字符串分割成两部分,可以在下一行继续写;数据库名称、表名称、字段名称尽量不要用mysql的保留字,如果需要使用的时候需要使用反引号(“)将名称括起来。

网络上很多人咨询mysql是否提供布尔类型?MySQL数据库确实提供布尔类型,此数据类型的关键字可以写成:布尔类型BOOL或布尔类型…

====================数据表的操作

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

====================下个视频:7

导读】

3、字符串类型:CHAR(M):定长字符串,M代表存储的字符数,M个字节,0<=M<=255;
VARCHAR(M):变长字符串,M个字节,L+1个字节,其中 L<=M
并且0<=M<=65535;TINYTEXT;TEXT:用于存储大量的文本字符串,MEDIUMTEXT;LONGTEXT;ENUM(‘value1′,’value2’,…):1个或2个字节,取决于枚举值的个数(最多65535个值),当我们的值可以被列举出来的时候选用枚举类型,枚举类型的值只能从列举出的值中选一个;SET(‘value1′,’value2’,…):集合,把值保存到集合里,集合里最多可以保存64个成员值,和枚举不同的是SET集合可以选择多个值。

b). 测试数据的写入

 

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

CREATE TABLE IF NOT EXISTS `user`(
id SMALLINT,
username VARCHAR(20),
age TINYINT,
sex ENUM(‘男’,’女’,’保密’),
email VARCHAR(50),
addr VARCHAR(200),
birth YEAR,
salary FLOAT(8,2),
tel INT,
married TINYINT(1)
)ENGINE=INNODB CHARSET=UTF8;

小结:

查看当前数据库已有数据库:SHOW
DATABASES;

小结:

查看指定数据库的定义:SHOW
CREATE {DATABASE} db_name;

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

MySQL帮助手册:HELP(? \h
) + (类型名称等其他命令):HELP CREATE TABLE;HELP CREATE
DATABASE;

[email protected] : test 05:12:58> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(TRUE,FALSE);     Query OK, 1 row affected (0.00 sec)     [email protected] : test 05:13:58> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(1,0);     Query OK, 1 row affected (0.00 sec)     [email protected] : test 05:14:04> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(2,-1);     Query OK, 1 row affected (0.00 sec)     [email protected] : test 05:14:11> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(-128,127);     Query OK, 1 row affected (0.00 sec) 

[email protected] : test 05:14:18> INSERT INTO boolean_test(Online_Flag,Lock_Flag) VALUES(-256,256);     Query OK, 1 row affected, 2 warnings (0.00 sec)     [email protected] : test 05:14:24> SHOW WARNINGS;     +---------+------+------------------------------------------------------+     | Level   | Code | Message                                              |     +---------+------+------------------------------------------------------+     | Warning | 1264 | Out of range value for column 'Online_Flag' at row 1 |     | Warning | 1264 | Out of range value for column 'Lock_Flag' at row 1   |     +---------+------+------------------------------------------------------+     2 rows in set (0.00 sec) 

 

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

 

*************************** 1. row ***************************            Table: boolean_test     Create Table: CREATE TABLE `boolean_test` (       `ID` int(11) NOT NULL AUTO_INCREMENT,       `Online_Flag` tinyint(1) DEFAULT NULL,       `Lock_Flag` tinyint(1) DEFAULT NULL,       PRIMARY KEY (`ID`)     ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8     1 row in set (0.00 sec) 

====================数据表的创建
MySQL注释:#;–;
字段注释:COMMENT

–创建新闻分类表cms_cate
CREATE TABLE IF NOT EXISTS cms_cate(
id TINYINT,
cateName VARCHAR(50),
cateDesc VARCHAR(200)
)ENGINE=MyISAM CHARSET=UTF8;

先有表结构,再有数据,数据表名称要求唯一,而且不要包含特殊字符。数据表由行row和列column构成的二维网络。

修改指定数据库的编码方式:ALTER
{DATABASE} db_name [DEFAULT] CHARACTER SET [=]
charset_name;

得到mysql当前版本:select
version(); 显示当前日期时间:select now(); 显示当前用户:select
user();

2、浮点类型:FLOUT[(M,D)]:占4个字节,M是数字总位数,D是小数点后面的位数,如果M和D被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位。
DOUBLE[M,D]:占8个字节,双精度浮点数。
DECIMAL[(M,D)]:定点数,和DOUBLE一样,但在内部以字符串形式存储数值,所以精度会更高,不会进行四舍五入。

4、日期时间类型:TIME存储时间;DATE存储日期;DATETIME存储日期时间;TIMESTAMP存储时间戳;YEAR存储年份,占用1个字节大小;一般都是通过整型来保存时间戳,这样方便计算。

 

–课程表
CREATE TABLE IF NOT EXISTS course(
cid TINYINT,
courseName VARCHAR(50),
courseDesc VARCHAR(200)
);

===================================数据库相关操作:

 

USE `maizi`;

开启mysql的输出日志:\T
后跟路径;\t 结束输出日志。

通过my.ini配置文件修改字符集:客户端字符集设置:[mysql]default-character-set=utf8
[mysqld] character-set-server=utf8
。设置之后保存,在重启mysql服务。登录mysql:mysql -uroot -p (-u用户名
-p密码 -h服务器名称(ip地址) -P端口号(3306)-D打开指定数据库
–prompt=name指定命令提示符(只针对当前连接有效)
–delimiter=name指定分隔符
-V输出版本星系)再输入密码。退出:exit,quit,\q 。

打开指定数据库:USE
db_name;打开数据库后就可以在指定数据库里面建表等操作。
得到当前打开的数据库名称:SELECT
DATABASE();

–创建maizi数据库
CREATE DATABASE IF NOT EXISTS `maizi` DEFAULT CHARACTER SET ‘UTF8’;

查看上一步操作产生的警告:SHOW
WARNINGS;

MySQL中的数据类型:整数类型,浮点类型,字符串类型,日期时间类型,二进制类型。

 

查看当前数据库下的数据表:SHOW
TABLES;(创建一个表相当于在磁盘上创建了一个文件。)

在命令行调出之前写过的命令,通过上下箭头键。

5、二进制类型:主要是用来保存二进制数据,用的少,一般视频和图片都以路径的形式加以保存。

1、整数类型:TINYINT(-128~127,0~255,1字节),SMALLINT(-32768~32768,0~65535,2字节),MEDIUMINT,INT(2的32次方,0~4294967295,4字节),BIGINT(8字节),BOOL,BOOLEAN(TINYINT(1),O为false,其余为true,1字节)

====================数据表的存储引擎
存储引擎就是表的类型。数据库的存储类型决定了表在计算机中的存储方式,用户可以根据不同的存储方式、是否进行事务处理等来选择合适的存储引擎。Mysql常用的存储引擎:InnoDB存储引擎(支持事务,回滚。并发控制,支持外键约束,读写效率低,占用空间大。默认引擎),MyISAM存储引擎(不支持事务),MEMORY存储引擎(存放在内存中,处理速度快,较少使用)。查看MySQL支持的存储引擎:SHOW
ENGINES;查看显示支持的存储引擎信息:SHOW VARIABLES LIKE
‘have%’;查看默认的存储引擎:SHOW VARIABLES LIKE ‘storage_engine’;