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 相关文章推荐
浅谈mysql执行过程以及顺序
May 12 MySQL
MySQL 8.0 之不可见列的基本操作
May 20 MySQL
MySQL系列之十一 日志记录
Jul 02 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 MySQL
关于mysql中时间日期类型和字符串类型的选择
Nov 27 MySQL
MySQL分区表管理命令汇总
Mar 21 MySQL
Mysql如何实现不存在则插入,存在则更新
Mar 25 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 MySQL
MySQL池化框架学习接池自定义
Jul 23 MySQL
MySQL自定义函数及触发器
Aug 05 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中session_unset与session_destroy的区别分析
2011/06/16 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
Js的MessageBox
2006/12/03 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
详解webpack2+React 实例demo
2017/09/11 Javascript
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
Vue单页应用引用单独的样式文件的两种方式
2018/03/30 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
Vant 中的Toast设置全局的延迟时间操作
2020/11/04 Javascript
token 机制和实现方式
2020/12/15 Javascript
JavaScript实现4位随机验证码的生成
2021/01/28 Javascript
对于Python的框架中一些会话程序的管理
2015/04/20 Python
Python中的FTP通信模块ftplib的用法整理
2016/07/08 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
Python构建图像分类识别器的方法
2019/01/12 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
Python+OpenCV图像处理——实现轮廓发现
2020/10/23 Python
pycharm 配置svn的图文教程(手把手教你)
2021/01/15 Python
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
三好学生个人先进事迹材料
2014/05/17 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
学习与创新自我评价
2015/03/09 职场文书
浪漫婚礼主持词开场白
2015/11/24 职场文书
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android