mysql中整数数据类型tinyint详解


Posted in MySQL onDecember 06, 2021

1.1 tinyint类型说明

数据类型 显示长度 占用字节 有符号 无符号
tinyint 加上unsigned/zerofill:3
不加unsigned/zerofill:4
1(8bit) -128至127 0至255
#### 格式
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 changed
 
mysql> 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_tables
mysql> 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_SUBSTITUTION
1 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 1
 
mysql> 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 1
mysql> 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_SUBSTITUTION
1 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,而是0
 
mysql> insert into test11(id) values(0);
Query OK, 1 row affected (0.01 sec)
    ## 没报错,因为在范围内,插入到表中的也是0
 
mysql> insert into test11(id) values(255);
Query OK, 1 row affected (0.01 sec)
    ## 没报错,因为在范围内,插入到表中的也是255
 
mysql> insert into test11(id) values(256);
Query OK, 1 row affected, 1 warning (0.00 sec)
   ## 不在范围内,插入没有报错(因为sql_mode中没有开启严格模式)
   ## 插入到表中的数据不是256,而是255
  
mysql> 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_tables
mysql> 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_SUBSTITUTION
1 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 1
 
mysql> 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 1
 
mysql> 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_SUBSTITUTION
1 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)
  ## 没报错,因为在范围内,插入到表中的也是0
 
mysql> insert into test22(id) values(255);
Query OK, 1 row affected (0.01 sec)
  ## 没报错,因为在范围内,插入到表中的也是255
 
mysql> insert into test22(id) values(256); 
Query OK, 1 row affected, 1 warning (0.00 sec)
  ## 不在范围,插入没报错(sql_mode中没有开启严格模式)
  ## 但到表中的数据不是256,而是255
 
mysql> 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_tables
mysql> 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_SUBSTITUTION
1 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 1
 
mysql> 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 1
 
mysql> 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_SUBSTITUTION
1 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 相关文章推荐
MySQL8.0.24版本Release Note的一些改进点
Apr 22 MySQL
MySQL 角色(role)功能介绍
Apr 24 MySQL
MySQL中distinct和count(*)的使用方法比较
May 26 MySQL
MySQL注入基础练习
May 30 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
MySQL REVOKE实现删除用户权限
Jun 18 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
浅谈MySQL函数
Oct 05 MySQL
MySQL创建表操作命令分享
Mar 25 MySQL
分享几个简单MySQL优化小妙招
Mar 31 MySQL
MySQL实现用逗号进行拼接、以逗号进行分割
Dec 24 MySQL
SQL注入详解及防范方法
Dec 06 #MySQL
防止web项目中的SQL注入
Dec 06 #MySQL
mysql创建存储过程及函数详解
Dec 04 #MySQL
mysql5.6主从搭建以及不同步问题详解
MySQL图形化管理工具Navicat安装步骤
全面盘点MySQL中的那些重要日志文件
关于mysql中时间日期类型和字符串类型的选择
Nov 27 #MySQL
You might like
php 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
深入php处理整数函数的详解
2013/06/09 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
2017/10/26 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JavaScript中的console.log()函数详细介绍
2014/12/29 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
js实现类bootstrap模态框动画
2017/02/07 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
详解js的视频和音频采集
2018/08/09 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Golang与python线程详解及简单实例
2017/04/27 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
Python unittest单元测试框架及断言方法
2020/04/15 Python
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
中国电子产品批发商/跨境电商/外贸网:Sunsky-online
2020/04/20 全球购物
大学生求职简历的自我评价范文
2013/10/12 职场文书
在职研究生自我鉴定
2013/10/16 职场文书
学生宿舍管理制度
2014/01/30 职场文书
标准版离职证明书
2014/09/12 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
新郎新娘答谢词
2015/01/04 职场文书
党支部审查意见
2015/06/02 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python
sql通过日期判断年龄函数的示例代码
2021/07/16 SQL Server
JS数组方法some、every和find的使用详情
2021/10/05 Javascript