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学习总结-基础架构概述
Apr 05 MySQL
MySQL查询学习之基础查询操作
May 08 MySQL
超详细教你怎么升级Mysql的版本
May 19 MySQL
mysql脏页是什么
Jul 26 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
浅谈如何保证Mysql主从一致
Mar 13 MySQL
MySQL多表查询机制
Mar 17 MySQL
MySQL创建表操作命令分享
Mar 25 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
Apr 03 MySQL
MySQL GTID复制的具体使用
May 20 MySQL
详解Mysql数据库平滑扩容解决高并发和大数据量问题
May 25 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 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 curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
php制作unicode解码工具(unicode编码转换器)代码分享
2013/12/24 PHP
php删除数组中重复元素的方法
2015/12/22 PHP
基于php编程规范(详解)
2017/08/17 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
php 策略模式原理与应用深入理解
2019/09/25 PHP
理解Javascript_13_执行模型详解
2010/10/20 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
详解webpack loader和plugin编写
2018/10/12 Javascript
vue-lazyload使用总结(推荐)
2018/11/01 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
利用python获取Ping结果示例代码
2017/07/06 Python
Anaconda多环境多版本python配置操作方法
2017/09/12 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
python使用scrapy发送post请求的坑
2018/09/04 Python
使用python判断你是青少年还是老年人
2018/11/29 Python
浅析Python 中几种字符串格式化方法及其比较
2019/07/02 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
面向对象编程的优势是什么
2015/12/17 面试题
小学生竞选班长演讲稿
2014/04/24 职场文书
工作时间调整通知
2015/04/24 职场文书
地道战观后感500字
2015/06/04 职场文书
nginx处理http请求实现过程解析
2021/03/31 Servers