MySql数据类型(重点)
- 格式:doc
- 大小:52.50 KB
- 文档页数:8
MySQL(⼆)数据库数据类型详解 序⾔ 今天去健⾝了,感觉把⾝体练好还是不错的,闲话不多说,把这个数据库所遇到的数据类型今天统统在这⾥讲清楚了,以后在看到什么数据类型,咱度应该认识,下⾯就跟着我的节奏去把这个拿下吧。
---WZY⼀、数据类型 MySQL的数据类型有⼤概可以分为5种,分别是整数类型、浮点数类型和定点数类型、⽇期和时间类型、字符串类型、⼆进制类型。
现在可以来看看你对这5种类型的熟悉程度,哪个看起来懵逼了,那就说明⾃⼰哪个不熟悉,不理解。
注意:整数类型和浮点数类型可以统称为数值数据类型,这不难理解。
数值数据类型 整数类型:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 浮点数类型:FLOAT、DOUBLE 定点⼩数:DECIMAL ⽇期/时间类型 YEAR、TIME、DATE、DATETIME、TIMESTAMP 字符串类型 CHAR、VARCHAR、TEXT、ENUM、SET等 ⼆进制类型 BIT、BINARY、VARBINARY、BLOB 1、整数类型 不管你学什么语⾔,在基础⽅⾯,都应该知道 1个字节= 8位⼆进制数。
每个类型的取值范围也就能够知道,⽐如TINYINT占⽤1个字节,也就是8位,2的8次⽅减1等于255,也就是说如果代表没符号的整数,该取值范围为0~255,如果是有符号的,最⾼位为符号号位,也就是2的7次⽅减1,也就是127,取值范围为-128~127,为什么需要减1,这个问题就需要考虑临界值的问题了。
⽽考虑临界值问题⼜有需要讨论原码补码反码的知识,这些度不是我们讨论的重点,所以在这就⾃⾏百度。
给出⼀张范围表,给⼤家做参考。
不同整数类型的取值范围 根据⾃⼰所需去选取不同的类型名称, 例如: CREATE TABLE aaa( id INT(10) PRIMARY KEY, age INT(6) ); 这个例⼦中INT(10)、INT(6) 括号中的数字表⽰的是该数据类型指定的显⽰宽度,指定能够显⽰的数值中数字的个数。
MySQL中blob和text数据类型详解前⾔:我们介绍过⼀些常⽤数据类型的⽤法,⽐如 int、char、varchar 等。
⼀直没详细介绍过 blob 及 text 类型,虽然这两类数据类型不太常⽤,但在某些场景下还是会⽤到的。
本篇⽂章将主要介绍 blob 及 text 数据类型的相关知识。
1. blob 类型blob(binary large object) 是⼀个可以存储⼆进制⽂件的容器,主要⽤于存储⼆进制⼤对象,例如可以存储图⽚,⾳视频等⽂件。
按照可存储容量⼤⼩不同来分类,blob 类型可分为以下四种:类型可存储⼤⼩⽤途TINYBLOB0 - 255字节短⽂本⼆进制字符串BLOB0 - 65KB⼆进制字符串MEDIUMBLOB0 - 16MB⼆进制形式的长⽂本数据LONGBLOB0 - 4GB⼆进制形式的极⼤⽂本数据其中最常⽤的就是 blob 字段类型了,最多可存储 65KB ⼤⼩的数据,⼀般可⽤于存储图标或 logo 图⽚。
不过数据库并不适合直接存储图⽚,如果有⼤量存储图⽚的需求,请使⽤对象存储或⽂件存储,数据库中可以存储图⽚路径来调⽤。
2. text 类型text 类型同 char、varchar 类似,都可⽤于存储字符串,⼀般情况下,遇到存储长⽂本字符串的需求时可以考虑使⽤ text 类型。
按照可存储⼤⼩区分,text 类型同样可分为以下四种:类型可存储⼤⼩⽤途TINYTEXT0 - 255字节⼀般⽂本字符串TEXT0 - 65 535字节长⽂本字符串MEDIUMTEXT0 - 16 772 150字节较⼤⽂本数据LONGTEXT0 - 4 294 967 295字节极⼤⽂本数据不过在⽇常场景中,存储字符串还是尽量⽤ varchar ,只有要存储长⽂本数据时,可以使⽤ text 类型。
对⽐ varchar ,text 类型有以下特点:text 类型⽆须指定长度。
若数据库未启⽤严格的 sqlmode ,当插⼊的值超过 text 列的最⼤长度时,则该值会被截断插⼊并⽣成警告。
MySql数据库的列类型(字段类型)MySQL数据库的表是一个二维表,由一个或多个数据列构成。
每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。
MySQL中的列类型有三种:数值类、字符串类和日期/时间类。
从大类来看列类型和数值类型一样,都是只有三种。
但每种列类型都还可细分。
下面对各种列类型进行详细介绍。
数值类的数据列类型数值型的列类型包括整型和浮点型两大类。
TINYINT:1字节非常小的正整数,带符号:-128~127,不带符号:0~255SMALLINT:2字节小整数,带符号:-32768~32767,不带符号:0~65535MEDIUMINT:3字节中等大小的整数,带符号:-8388608~8388607,不带符号:0~16777215INT:4字节标准整数,带符号:-2147483648~2147483647,不带符号:0~4294967295BIGINT:8字节大整数,带符号:-9223372036854775808~9233372036854775807,不带符号:0~18446744073709551615FLOAT:4字节单精度浮点数,最小非零值:+-1.175494351E-38,最大非零值:+-3.402823466E+38 DOUBLE:8字节双精度浮点数,最小非零值:+-2.2250738585072014E-308,最大非零值:+-1.7976931348623157E+308DECIMAL:M+2字节以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。
整型数据列类型MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。
它们之间的区别是取值范围不同,存储空间也各不相同。
在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
MySQL数据类型(float)的注意事项摘要:今天左哥问起⼀个float浮点数类型的问题,这个类型⽤的不多,所以也不太了解,现在打算测试下。
知识点:float:浮点数,单精度,占4字节。
测试root@localhost : test 05:49:32>create table fl(id int,fl float);Query OK, 0 rows affected (0.05 sec)root@localhost : test 05:49:40>insert into fl values(1,123456);Query OK, 1 row affected (0.00 sec)root@localhost : test 05:49:51>insert into fl values(2,123.456);Query OK, 1 row affected (0.00 sec)root@localhost : test 05:49:57>insert into fl values(3,1234.567);#7位了Query OK, 1 row affected (0.00 sec)root@localhost : test 05:50:13>insert into fl values(4,1234567);#7位了Query OK, 1 row affected (0.00 sec)root@localhost : test 05:50:26>select*from fl;+------+-------------+| id | fl |+------+-------------+|1|123456||2|123.456||3|1234.57||4|1.23457e+06|+------+-------------+4 rows in set (0.00 sec)从上⾯看出:默认的float类型都只能存6个数字(包括⼩数点前后的位数),整数超过6位就被科学计数表⽰(id=4),⼩数位超出则需要四舍五⼊。
mysql数据库的number类型全文共四篇示例,供读者参考第一篇示例:MySQL数据库的Number类型是一种非常常用的数据类型,它用来存储数值型数据,包括整数和小数。
在实际的数据库设计和开发中,我们经常会用到Number类型来存储各种数字数据,比如订单金额、产品价格、数量等等。
在本文中,我们将详细介绍MySQL数据库中的Number类型,包括其各种子类型和用法。
MySQL数据库中的Number类型主要包括两种子类型,即整数型和浮点型。
整数型包括TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT,分别用来存储不同范围的整数数据。
浮点型包括FLOAT和DOUBLE,用来存储小数数据。
下面我们将分别介绍这些Number类型的特点和用法。
1. TINYINTTINYINT类型用来存储小范围的整数数据,取值范围为-128到127。
TINYINT类型占用1个字节的存储空间,适用于存储性别、状态等只有两个取值的数据。
6. FLOATFLOAT类型用来存储单精度浮点数,即小数数据。
FLOAT类型占用4个字节的存储空间,可以存储6-7位的有效数字,适用于存储科学计算、工程测量等领域的数据。
第二篇示例:MySQL数据库中的number类型主要用于存储数值型数据,包括整型和浮点型两种。
整型数据包括TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT,而浮点型数据包括FLOAT和DOUBLE。
在数据库表的设计中,合理地选择number类型可以提高数据库的性能和数据存储效率。
让我们来了解一下MySQL数据库中number类型的具体描述和用法。
1. TINYINT:TINYINT类型用于存储非常小的整数数据,范围在-128到127之间。
它占用1个字节的存储空间,适用于存储布尔类型数据或者只需要记录小整数的场景。
6. FLOAT:FLOAT类型用于存储单精度浮点数数据,范围在-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38之间。
mysql中整数数据类型tinyint详解⽬录1.1tinyint类型说明1.2实践环境说明1.3加unsigned属性1.3.1SQL模式开启严格模式1.3.2SQL模式未开启严格模式1.4加zerofill属性1.4.1SQL模式开启严格模式1.4.2SQL模式未开启严格模式1.5不加unsigned和zerofill属性1.5.1SQL模式开启严格模式1.5.2SQL模式未开启严格模式1.1 tinyint类型说明数据类型显⽰长度占⽤字节有符号⽆符号1(8bit)-128⾄1270⾄255tinyint加上unsigned/zerofill:3不加unsigned/zerofill:4#### 格式id tinyint(M) [unsigned] [zerofill]字段名数据类型(显⽰长度,不指定指定) ⽆符号⽆符号且前导零填充#### 关于tinyint最⼤数值是怎样得来的tinyint占⽤1字节,1字节占⽤8位,经过换算(2的8次⽅减1)就是255;#### 关于加上unsigned后的说明加上unsigned属性后就是⽆符号(范围是0~255的整数,因为是整数,不会有符号"-",所以就是⽆符号)#### 关于加上zerofill后的说明zerofill属性会把unsigned属性也给带上,这样就是⽆符号(范围是0~255,显⽰长度就是3),同时还会进⾏前导零填充(没有达到显⽰长度的数值,例如:你插⼊1,显⽰的是001)。
#### 不加unsigned和zerofill的说明字段后⾯不加上这两个属性中的任何⼀个,就表⽰是有符号(范围是-128~127,因为有符号"-",所有是有符号)。
1.2 实践环境说明#### 数据库版本和默认的存储引擎mysql> select @@version,@@default_storage_engine;+------------+--------------------------+| @@version | @@default_storage_engine |+------------+--------------------------+| 5.7.28-log | InnoDB |+------------+--------------------------+1 row in set (0.00 sec)#### 创建chenliang库mysql> create database if not exists chenliang;Query OK, 1 row affected (0.03 sec)mysql> show databases like "chenliang";+----------------------+| Database (chenliang) |+----------------------+| chenliang |+----------------------+1 row in set (0.03 sec)#### 进⼊chenliang库,并查看是否成功进⼊到库下⾯mysql> use chenliang;Database changedmysql> select database();+------------+| database() |+------------+| chenliang |+------------+1 row in set (0.01 sec)#### 查看事务是否⾃动提交mysql> select @@global.autocommit;+---------------------+| @@global.autocommit |+---------------------+| 1 |+---------------------+1 row in set (0.00 sec)1.3 加unsigned属性1.3.1 SQL模式开启严格模式SQL_MODE中开启了严格模式,即SQL_MODE参数中包含STRICT_TRANS_TABLES参数#### 设置会话模式下的sql_mode中包含strict_trans_tablesmysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; Query OK, 0 rows affected (0.00 sec)mysql> select @@sql_mode\G*************************** 1. row ***************************@@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION1 row in set (0.00 sec)#### 创建test1测试表(这⾥指定了UNSIGNED,也就是⽆符号)mysql> CREATE TABLE IF NOT EXISTS test1(-> id tinyint UNSIGNED-> )engine=innodb character set utf8 collate utf8_general_ci;Query OK, 0 rows affected (0.06 sec) ## id字段类型是tinyint unsigned,范围就是0~255,其长度是3;因为255的长度是3;#### 查看test1表的表结构mysql> desc test1;+-------+---------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------------------+------+-----+---------+-------+| id | tinyint(3) unsigned | YES | | NULL | |+-------+---------------------+------+-----+---------+-------+1 row in set (0.03 sec)#### 测试插⼊范围0~255范围整数和不在该范围内的整数mysql> insert into test1 values(-1); # 插⼊数值-1,错误(不在0~255范围内)ERROR 1264 (22003): Out of range value for column 'id' at row 1mysql> insert into test1 values(0); # 插⼊数值0,正常(在0~255范围内)Query OK, 1 row affected (0.06 sec)mysql> insert into test1 values(255); # 插⼊数值255,正常(在0~255范围内)Query OK, 1 row affected (0.05 sec)mysql> insert into test1 values(256); # 插⼊数值256,错误(不在0~255范围内)ERROR 1264 (22003): Out of range value for column 'id' at row 1mysql> select * from test1;+------+| id |+------+| 0 || 255 |+------+2 rows in set (0.00 sec)1.3.2 SQL模式未开启严格模式SQL_MODE未开启严格模式,即SQL_MODE参数中不包含STRICT_TRANS_TABLES参数#### 设置会话模式下sql_mode中不包含strit_trans_tables变量mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> select @@sql_mode\G*************************** 1. row ***************************@@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION1 row in set (0.00 sec)#### 创建test11表(这⾥指定了UNSIGNED,也就是⽆符号)mysql> create table if not exists test11(-> id tinyint unsigned-> )engine=innodb character set utf8 collate utf8_general_ci;Query OK, 0 rows affected (0.00 sec) ## id字段类型是tinyint unsigned,范围就是0~255,其长度是3;因为255的长度是3;#### 查看test11表的表结构mysql> desc test11;+-------+---------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+---------------------+------+-----+---------+-------+| id | tinyint(3) unsigned | YES | | NULL | |+-------+---------------------+------+-----+---------+-------+1 row in set (0.00 sec)#### 测试插⼊范围0~255范围整数和不在该范围内的整数mysql> insert into test11(id) values(-1);Query OK, 1 row affected, 1 warning (0.00 sec) ## 不在范围内,插⼊没有报错(因为sql_mode中没有开启严格模式) ## 插⼊到表中的数据不是-1,⽽是0mysql> insert into test11(id) values(0);Query OK, 1 row affected (0.01 sec)## 没报错,因为在范围内,插⼊到表中的也是0mysql> insert into test11(id) values(255);Query OK, 1 row affected (0.01 sec)## 没报错,因为在范围内,插⼊到表中的也是255mysql> insert into test11(id) values(256);Query OK, 1 row affected, 1 warning (0.00 sec) ## 不在范围内,插⼊没有报错(因为sql_mode中没有开启严格模式) ## 插⼊到表中的数据不是256,⽽是255mysql> select * from test11;+------+| id |+------+| 0 || 0 || 255 || 255 |+------+4 rows in set (0.00 sec)1.4 加zerofill属性1.4.1 SQL模式开启严格模式SQL_MODE中开启了严格模式,即SQL_MODE参数中包含STRICT_TRANS_TABLES参数## 设置会话模式下的sql_mode中包含strict_trans_tablesmysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; Query OK, 0 rows affected (0.00 sec)mysql> select @@sql_mode\G*************************** 1. row ***************************@@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION1 row in set (0.00 sec)## 创建test2测试表(这⾥指定了zerofill,会前导零填充,同时还会带上unsigned)mysql> CREATE TABLE IF NOT EXISTS test2(-> id tinyint zerofill-> )engine=innodb character set utf8 collate utf8_general_ci;Query OK, 0 rows affected (0.01 sec)## id字段类型是tinyint zerofill,范围就是0~255,其长度是3;因为255的长度是3;## 查看test2表的表结构mysql> desc test2;+-------+------------------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+------------------------------+------+-----+---------+-------+| id | tinyint(3) unsigned zerofill | YES | | NULL | |+-------+------------------------------+------+-----+---------+-------+1 row in set (0.00 sec)## 测试插⼊范围0~255范围整数和不在该范围内的整数mysql> insert into test2 values(-1); # 插⼊数值-1,错误(不在0~255范围内)ERROR 1264 (22003): Out of range value for column 'id' at row 1mysql> insert into test2 values(0); # 插⼊数值0,正常(在0~255范围内)Query OK, 1 row affected (0.06 sec)mysql> insert into test2 values(255); # 插⼊数值255,正常(在0~255范围内)Query OK, 1 row affected (0.05 sec)mysql> insert into test2 values(256); # 插⼊数值256,错误(不在0~255范围内)ERROR 1264 (22003): Out of range value for column 'id' at row 1mysql> select * from test2;+------+| id |+------+| 000 || 255 |+------+2 rows in set (0.00 sec)1.4.2 SQL模式未开启严格模式SQL_MODE未开启严格模式,即SQL_MODE参数中不包含STRICT_TRANS_TABLES参数## 设置会话模式下sql_mode中不包含strit_trans_tables变量mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> select @@sql_mode\G*************************** 1. row ***************************@@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION1 row in set (0.00 sec)## 创建test22表(这⾥指定了zerofill,会前导零填充,同时还会带上unsigned)mysql> create table if not exists test22(-> id tinyint zerofill-> )engine=innodb character set utf8 collate utf8_general_ci;Query OK, 0 rows affected (0.00 sec) ## id字段类型是tinyint unsigned,范围就是0~255,其长度是3;因为255的长度是3;## 查看test22表的表结构mysql> desc test22;+-------+------------------------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+------------------------------+------+-----+---------+-------+| id | tinyint(3) unsigned zerofill | YES | | NULL | |+-------+------------------------------+------+-----+---------+-------+1 row in set (0.00 sec)## 测试插⼊范围0~255范围整数和不在该范围内的整数mysql> insert into test22(id) values(-1);Query OK, 1 row affected, 1 warning (0.00 sec) ## 不在范围,插⼊没报错(因为sql_mode中没有开启严格模式); ## 但到表中的不是-1,⽽是0,但因为有zerofill参数,所以显⽰时会前导零序填充;mysql> insert into test22(id) values(0);Query OK, 1 row affected (0.01 sec) ## 没报错,因为在范围内,插⼊到表中的也是0mysql> insert into test22(id) values(255);Query OK, 1 row affected (0.01 sec) ## 没报错,因为在范围内,插⼊到表中的也是255mysql> insert into test22(id) values(256);Query OK, 1 row affected, 1 warning (0.00 sec) ## 不在范围,插⼊没报错(sql_mode中没有开启严格模式) ## 但到表中的数据不是256,⽽是255mysql> select * from test22;+------+| id |+------+| 000 || 000 || 255 || 255 |+------+4 rows in set (0.00 sec)1.5 不加unsigned和zerofill属性1.5.1 SQL模式开启严格模式SQL_MODE中开启了严格模式,即SQL_MODE参数中包含STRICT_TRANS_TABLES参数## 设置会话模式下的sql_mode中包含strict_trans_tablesmysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"; Query OK, 0 rows affected (0.00 sec)mysql> select @@sql_mode\G*************************** 1. row ***************************@@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION1 row in set (0.00 sec)## 创建test3表(不加unsigned和zerofill)mysql> CREATE TABLE test3(-> id tinyint-> )engine=innodb character set utf8 collate utf8_general_ci;Query OK, 0 rows affected (0.06 sec) ## id字段的类型为tinyint,其范围是-128⾄127,其显⽰长度是4,因为要显⽰符号("-")## 查看test3表的表结构mysql> desc test3;+-------+------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| id | tinyint(4) | YES | | NULL | |+-------+------------+------+-----+---------+-------+1 row in set (0.01 sec)## 测试插⼊-128~127范围的整数和不在该范围内的整数mysql> insert into test3(id) values(-129); # 插⼊数值-129,错误,不在范围内ERROR 1264 (22003): Out of range value for column 'id' at row 1mysql> insert into test3(id) values(-128); # 插⼊数值-128,正确,在范围内Query OK, 1 row affected (0.00 sec)mysql> insert into test3(id) values(127); # 插⼊数值127,正确,在范围内Query OK, 1 row affected (0.01 sec)mysql> insert into test3(id) values(128); # 插⼊数值128,错误,不在范围内ERROR 1264 (22003): Out of range value for column 'id' at row 1mysql> select * from test3;+------+| id |+------+| -128 || 127 |+------+2 rows in set (0.00 sec)1.5.2 SQL模式未开启严格模式SQL_MODE中未开启严格模式,即SQL_MODE参数中不包含STRICT_TRANS_TABLES参数## 设置会话模式下sql_mode中不包含strit_trans_tables变量mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> select @@sql_mode\G*************************** 1. row ***************************@@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION1 row in set (0.00 sec)## 创建test33表(不加unsigned和zerofill)mysql> CREATE TABLE test33(-> id tinyint-> )engine=innodb character set utf8 collate utf8_general_ci;Query OK, 0 rows affected (0.00 sec) ## id字段的类型为tinyint,其范围是-128⾄127,其显⽰长度是4,因为要显⽰符号("-")## 查看test33表的表结构mysql> desc test33;+-------+------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+------------+------+-----+---------+-------+| id | tinyint(4) | YES | | NULL | |+-------+------------+------+-----+---------+-------+1 row in set (0.00 sec)## 测试插⼊-128~127范围的整数和不在该范围内的整数mysql> insert into test33(id) values(-129);Query OK, 1 row affected, 1 warning (0.00 sec) ## 不在范围内,插⼊未报错,因为sql_mode中没有开启严格模式 ## 插⼊到表中的不是-129,⽽是-128;mysql> insert into test33(id) values(-128);Query OK, 1 row affected (0.01 sec) ## 在范围内,插⼊不报错,插⼊的是多少就是多少mysql> insert into test33(id) values(127);Query OK, 1 row affected (0.00 sec) ## 在范围内,插⼊不报错,插⼊的是多少就是多少mysql> insert into test33(id) values(128);Query OK, 1 row affected, 1 warning (0.01 sec) ## 不在范围内,插⼊未报错,因为sql_mode中没有开启严格模式 ## 插⼊到表中的不是128,⽽是127;mysql> select * from test33;+------+| id |+------+| -128 || -128 || 127 || 127 |+------+4 rows in set (0.00 sec)到此这篇关于mysql中整数数据类型tinyint详解的⽂章就介绍到这了,更多相关mysql整数数据类型tinyint内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
MySQL数据库的数据类型和字段属性详解引言MySQL是一种非常流行和常用的关系型数据库管理系统,广泛应用于各种网站和应用程序中。
在使用MySQL进行数据库设计和开发时,数据类型和字段属性的选择非常重要,它们直接影响着数据库的性能和数据的完整性。
本文将详细介绍MySQL数据库中常用的数据类型和字段属性,以便读者能够更好地理解和应用它们。
一、数值类型1. 整型(INT)整型是MySQL中最基本和常用的数据类型之一。
在MySQL中,整型包括int、tinyint、smallint、mediumint和bigint五种。
它们的区别在于存储范围和占用空间的大小。
例如,int类型的范围是-2147483648到2147483647,占用空间为4字节。
2. 浮点型(FLOAT和DOUBLE)浮点型用于存储小数,包括单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。
FLOAT类型占用4字节,DOUBLE类型占用8字节。
浮点型能够存储非常大和非常小的数字,但是在精度上有一定的限制。
3. 定点类型(DECIMAL)定点类型用于存储精确的小数,其精度和范围可以由用户自定义。
DECIMAL类型在数据库中的存储是以字符串形式存储的,它具有较高的精度和较小的存储空间。
二、字符串类型1. 字符型(CHAR和VARCHAR)字符型用于存储字符串,包括固定长度的字符类型(CHAR)和可变长度的字符类型(VARCHAR)。
CHAR类型在数据库中占用固定的空间,而VARCHAR 类型根据存储的内容变化而变化。
CHAR类型在存储短字符串时效率较高,而VARCHAR类型适用于存储可变长度的内容。
2. 文本型(TEXT)文本型用于存储较长的字符串,其分为四种类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。
它们分别用于存储不同长度的文本内容,MEDIUMTEXT类型可以存储最大长度为16MB的文本。
三、日期和时间类型1. 日期类型(DATE)日期类型用于存储日期,包括年、月、日。
oracle和mysql的数据类型Oracle和MySQL是两种常用的关系型数据库管理系统。
虽然它们具有相似的功能和用途,但在数据类型方面存在一些差异。
本文将深入探讨Oracle和MySQL的数据类型,并逐步回答有关这两个数据库的常见问题。
第一部分:Oracle数据类型Oracle提供了广泛的数据类型,用于存储不同类型的数据。
以下是一些常见的Oracle数据类型:1. 字符串类型:- CHAR(n):固定长度的字符串,n表示最大长度。
- VARCHAR2(n):可变长度的字符串,n表示最大长度。
- CLOB:用于存储大量文本数据。
2. 数值类型:- NUMBER(p, s):表示固定精度和范围的数值,p表示总位数,s表示小数位数。
- INTEGER:整数类型。
- FLOAT(p):浮点数类型,p表示精度。
3. 日期和时间类型:- DATE:存储日期和时间。
- TIMESTAMP:带有时区的日期和时间。
4. 二进制类型:- BLOB:用于存储大量二进制数据。
- RAW(n):存储固定长度的原始二进制数据,n表示字节数。
第二部分:MySQL数据类型MySQL也提供了各种数据类型,用于存储不同类型的数据。
以下是一些常见的MySQL数据类型:1. 字符串类型:- CHAR(n):固定长度的字符串,n表示最大长度。
- VARCHAR(n):可变长度的字符串,n表示最大长度。
- TEXT:用于存储大量文本数据。
2. 数值类型:- INT(m):整数类型,m表示显示宽度。
- FLOAT(p, s):浮点数类型,p表示总位数,s表示小数位数。
- DECIMAL(p, s):高精度数值类型,p表示总位数,s表示小数位数。
3. 日期和时间类型:- DATE:存储日期。
- DATETIME:存储日期和时间。
4. 二进制类型:- BLOB:用于存储大量二进制数据。
- VARBINARY(n):可变长度的二进制数据,n表示最大长度。
常见数据类型mysql的数据类型常⽤的有:整数类型:bit、bool、tinyint、smallint、mediumint、 int、bigint浮点数类型:float、double 、decimal字符串类型:char、varchar、tinyblob、blob、mediumblob、longblob、tinytext、text 、mediumtext、longtext⽇期类型:Date、DateTime、TimeStamp、Time、Year......mysql最常见的的数据类型,⼤致可以分为三类:数值(包括整数、浮点数等等)、⽇期/时间和字符串(字符)类型。
varchar,char后⾯跟括号⾥⼀个数字,标识的是长度,是空间容量,⽽int(11),tinyint(1),bigint(20)等的数字,表⽰的是最⼩显⽰位数。
在建表时,mysql会⾃动分配长度:int(11)、tinyint(4)、smallint(6)、mediumint(9)、bigint(20)。
整数型类型字节数范围(有符号)范围(⽆符号)tinyint1(-128,127)(0,255)smallint2(-32768,32767)(0,65535)mediumint3(-8388608,8388607)(0,16777215)int或integer4(-2147483648,2147483647)(0,4294967295)bigint8(-263,263-1)(0,2^64)默认是有符号类型的,⽆符号的需要在类型后⾯跟上 unsigned⼀个字节8位,⼆进制标识,⽆符号范围就是2的8*字节数的幂所有数值数据类型(除BIT和BOOLEAN外)都可以有符号或⽆符号。
有符号数值列可以存储正或负的数值,⽆符号数值列只能存储正数。
默认情况为有符号,但如果你知道⾃⼰不需要存储负值,可以使⽤UNSIGNED关键字,这样做将允许你存储两倍⼤⼩的值。
mysql中的数据类型:整数类型小数类型日期与时间类型mysql中的字符串类型char(m) varchar(m) tinytext text mediumtext longtext enum set二进制类型:bit(m) binary(m) varbinary(m) tinyblob(M) 非常小的blob mediumblob(m) longblob(m)整型数据类型:【例5.1】创建表tmp1,其中字段x,y,z,m,n数据类型依次为TINYINT、SMALLINT、MEDIUMINT、INT、BIGINTCREA TE TABLE tmp1 ( x TINYINT, y SMALLINT, zMEDIUMINT, m INT, n BIGINT );系统自动添加不同的默认显示宽度浮点型的数据类型【例5.2】创建表tmp2,其中字段x,y,z,m,n数据类型依次为FLOA T(5,1)、DOUBLE(5,1)、DECIMAL(5,1),向表中插入数据5.12,5.15,5.123,CREA TE TABLE tmp2 ( x FLOA T(5,1), y DOUBLE(5,1), z DECIMAL(5,1) );向表中添加数据自动截取显示警告的语句show warnings;时间的数据类型:year【例5.3】创建数据表tmp3,定义数据类型为YEAR的字段y,向表中插入值2010,‘2010’,‘2166’创建表tmp3:CREA TE TABLE tmp3( y YEAR );插入数据:insert into tmp3 values(2010),('2010'),('2166');查询数据显示【例5.4】向tmp3表中y字段插入2位字符串表示的YEAR值,分别为‘0’,‘00’,‘10’,‘66’DELETE FROM tmp3;INSERT INTO tmp3 values('0'),('00'),('77'),('10');插入两位字符串对日期的影响【例5.5】向tmp3表中y字段插入2位数字表示表示的YEAR值,分别为0,78,11DELETE FROM tmp3;INSERT INTO tmp3 values(0),(78),(11);查看结果0被转成0000time的实例【例5.6】创建数据表tmp4,定义数据类型为TIME的字段t,向表中插入值‘10:05:05’,‘23:23’,‘2 10:10’,‘3 02’,‘10’CREA TE TABLE tmp4( t TIME );insert into tmp4 values('10:05:05 '), ('23:23'), ('2 10:10'), ('3 02'),('10');查询显示【例5.7】表tmp4中插入值‘101112’,111213,‘0’,107010 DELETE FROM tmp4;INSERT INTO tmp4 values('101112'),(111213),( '0') ,(107010);查询显示:【例5.8】向tmp4表中插入系统当前时间DELETE FROM tmp4;INSERT INTO tmp4 values (CURRENT_TIME) ,(NOW());查询显示:date实例【例5.9】创建数据表tmp5,定义数据类型为DA TE的字段d,向表中插入“YYYY-MM-DD”和“YYYYMMDD”字符串格式日期create table tmp5(d DA TE);insert into tmp5 values('1998-08-08'),('19980808'),('20101010');查询显示日期格式:【例5.10】向tmp5表中插入“YY-MM-DD“和“YYMMDD”字符串格式日期DELETE FROM tmp5;insert into tmp5 values('99-09-09'),( '990909'), ( '000101') ,( '121212');【例5.11】向tmp5表中插入YY-MM-DD和YYMMDD数字格式日期DELETE FROM tmp5;insert into tmp5 values(19990909),( 990909), ( 000101) ,( 121212);【例5.12】向tmp5表中插入系统当前日期DELETE FROM tmp5;insert into tmp5 values( CURRENT_DA TE() ),( NOW() );datetime实例【例5.13】创建数据表tmp6,定义数据类型为DA TETIME的字段dt,向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”字符串格式日期和时间值CREA TE TABLE tmp6( dt DA TETIME );INSERT INTO tmp6 values('1998-08-08 08:08:08'),('19980808080808'),('20101010101010');【例 5.14】向tmp6表中插入“YY-MM-DD HH:MM:SS “和“YYMMDDHHMMSS”字符串格式日期和时间值DELETE FROM tmp6;INSERT INTO tmp6 values('99-09-09 09:09:09'),('990909090909'),('101010101010');【例 5.15】向tmp6表中插入YY-MM-DD HH:MM:SS 和YYMMDDHHMMSS数值格式日期和时间值DELETE FROM tmp6;INSERT INTO tmp6 values('19990909090909'), ('101010101010');【例5.16】向tmp6表中插入系统当前日期和时间值DELETE FROM tmp6;insert into tmp6 values( NOW() );时间戳:【例5.17】创建数据表tmp7,定义数据类型为TIMESTAMP的字段ts,向表中插入值‘19950101010101’,‘950505050505’,‘1996-02-0202:02:02’,‘97@03@03 03@03@03’,121212121212,NOW() CREA TE TABLE tmp7( ts TIMESTAMP);INSERT INTO tmp7values ('19950101010101'),('950505050505'),('1996-02-02 02:02:02'),('97@03@03 03@03@03'),(121212121212),( NOW() );查询显示【例5.18】向tmp7表中插入当前日期,查看插入值,更改时区为东10区,再次查看插入值,SQL语句如下:DELETE FROM tmp7;mysql> insert into tmp7 values( NOW() );更改时区的set time_zone=’+10:00’;字符串类型【例5.20】创建tmp8表,定义字段ch和vch数据类型依次为CHAR (4)、V ARCHAR(4)向表中插入数据‘ab ’,SQL语句如下:CREA TE TABLE tmp8( ch CHAR(4), vch V ARCHAR(4) ); INSERT INTO tmp8 V ALUES('ab ', 'ab ');查询结果:select concat(‘(‘,ch,’)’),concat(‘(‘,vch,’)’) from tmp8;检索时char()将空格删除,而varchar()将空格保留enum类型【例5.21】创建表tmp9,定义ENUM类型的列enm('first','second','third'),查看列成员的索引值,SQL语句如下:create table tmp9( enm ENUM('first','second','third') );insert into tmp9 values('first'),('second') ,('third') ,('') ,(NULL);查询select enm,enm+0 from empt9; enum有一个索引值,列植从1开始编号【例5.22】创建表tmp10,定义INT类型的soc字段,ENUM类型的字段level,列表值为('excellent','good', 'bad'),向表tmp10中插入数据‘good’,1,2,3,‘best’,SQL语句如下:Create table tmp10 (soc INT, level enum('excellent', 'good','bad') );insert into tmp10 values(70,'good'), (90,1),(75,2),(50,3),(100,'best');显示警告:查询数据set类型:【例5.23】创建表tmp11,定义SET类型的字段s,取值列表为('a', 'b', 'c', 'd'),插入数据('a'),('a,b,a'),('c,a,d'),('a,x,b,y')。
create table tmp11 ( s SET('a', 'b', 'c', 'd'));INSERT INTOtmp11 values('a'),( 'a,b,a'),('c,a,d'),('a,x,b,y');可以有0个或者多个值查询数据显示bit类型【例5.24】创建表tmp12,定义BIT(4)类型的字段b,向表中插入数据2、9、15、16。