02 数据库入门学习-数据类型

一.数据存储引擎

1.什么是引擎 ?

引擎是一个功能的核心部分,现实中的引擎可以被分类。从动力来源来说,引擎可以分为汽油、 柴油、电动、混合动力等,需求场景的不同催生了不同的引擎类别。

在数据库中同样也是有引擎的。核心功能是存储数据 涉及到存储数据的代码 就称之为存储引擎

根据不同的需求,也有着不同的引擎分类。

创建表时在最后指定引擎名称 engine = xxx

create table t1(id int)engine=innodb
create table t2(id int not null)engine=csv
create table t3(id int)engine=memory
create table t4(id int)engine=blackhole

#innodb,默认的引擎,因为它是永久存储并且支持事务,行锁,外键
#csv,不能为空
#memory,在重启mysql或者重启机器后,表内数据清空
#blackhole,往表内插入任何数据,都相当于丢入黑洞,表内永远不存记录

insert into t1 value(1);
insert into t2 value(1);
insert into t3 value(1);
insert into t4 value(1);

select * from t1;#有值
select * from t2;#有值
select * from t3;#有值
select * from t4;#为空

二.创建表的完整语句

create table 表名(

字段名 数据类型(显示的长度)约束条件,

字段名 数据类型(显示的长度)约束条件,

..........

字段名 数据类型(显示的长度)约束条件

);

mysql> create table s1(a int(19) not null,
    -> b int(12) not null
    -> );

mysql> desc s1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a     | int(19) | NO   |     | NULL    |       |
| b     | int(12) | NO   |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

注意:①与Python的不同,最后不需要加逗号

   ②表名、字段名和数据类型都是必须有的

   ③显示的长度和约束条件是可选的

   ④字段名、表名甚至库名都不能是关键字

三.数据类型

1.整型

类型 大小 范围(有符号) 范围(无符号)
tinyint 1 -128~127 0~255
smallint 2 -32768~32767 0~65535
mediumint 3 -8388608~8388607 0~16777215
int 4 -2147483648~2147483647 0~4294967295
bigint 8 -9223372036854775808~9223372036854775807 0~18446744073709551615

默认情况下,整型是有符号的,需要一个二进制位存储

创建表的时候,给整型加上约束unsigned来表示无符号

  create table i1 (id int unsigned);

1.1严格模式与非严格模式

  MySQL自身对数据进行严格的校验(格式、长度、类型等),比如一个整型字段我们写入一个字符串类型的数据,只有在严格模式下MySQL才会报错,非严格模式下不会报错,对于一些错误的输入,非严格模式会用0或空来替代

Mysql处于非严格模式下:

  如果数据超出范围

    无符号: 例如 tinyint,输入256,保存的255,最大值;输入-123,保存0,最小值
    有符号 :例如 tinyint,输入256,保存的127,最大值;输入-1280,存的是-128,最小值

Mysql处于严格模式下:

  如果值超出范围就直接报错

  

为了在开发中,我们应该先判断数据的正确性,所以应该用严格模式

  查看当前模式 show variables like "sql_mode";
  修改为严格模式 set global sql_mode = "STRICT_TRANS_TABLES";

1.2 长度限制对于整型的意义

mysql>create table i1(id int(2));
mysql>insert into i1 value(454555);
mysql>select *from i1;

+--------+
| id |
+--------+
| 454555 |
+--------+
1 row in set (0.00 sec)

发现这个数也存储成功,说明,这里长度指的不是存储容量限制,而是显示的宽度。
  如果你的数据超过了显示宽度,有几个显示几个。
  如果不足,则补全到指定长度 得告诉它用什么来补全。

mysql>create table i1(id int(10) zerofill);#zerofill,用0来补全
mysql> insert into i1 value(12345);
mysql> select * from i1;
+------------+
| id         |
+------------+
| 0000012345 |
+------------+
1 row in set (0.00 sec)

总结:

要限制显示宽度
1.创建表时 给整型加上宽度
2.加上zerofill约束

有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

2.浮点型

类型 大小 范围(有符号) 范围(无符号)
float(m,d) 4
-3.402823466E+38 to -1.175494351E-38

1.175494351E-38 to 3.402823466E+38

1.175494351E-38 to 3.402823466E+38
double(m,d) 8
-1.7976931348623157E+308 to -2.2250738585072014E-308

2.2250738585072014E-308 to 1.7976931348623157E+308

2.2250738585072014E-308 to 1.7976931348623157E+308
decimal(m,d)                    动态

m表示 这个浮点数整体的长度
d表示 小数部分的长度
例如: float(5,3) 最大值: 99.999

相同点: float和double的小数部分最大长度都是30
     float和double的最大长度为255
不同点: decimal的整体最大长度65
     精度不同
      double 比 float 精度高
      decimal 是准确的 不会丢失精度

代码验证

mysql> create table i1(a float(100,20),b double(100,20),c decimal(65,20));
mysql> insert into i1 value(1.111111111111111111111111111111111,1.11111111111111111111111111111111,1.1111111111111111111111111);
mysql> select *from i1;
+------------------------+------------------------+------------------------+
| a                      | b                      | c                      |
+------------------------+------------------------+------------------------+
| 1.11111116409301760000 | 1.11111111111111120000 | 1.11111111111111111111 |
+------------------------+------------------------+------------------------+

3.字符型

3.1char 定长字符

char类型的长度是固定 无论你存储的数据有多长 占用的容量都一样

char(3) 存储的数据为 "a" 在硬盘保存的数据还是占3字符长度 实际保存的是"a "

如果你的数据不足指定长度 就在后面用空格补全

在硬盘中存储的是一连串的二进制,char类型取的时候是按照指定长度。

3.2varchar 变长字符

varchar 长度是可变的 存储的数据有多长就占用多长

varchar(3) 存储的数据为 "a" 在硬盘保存的数据还是占1字符长度 实际保存的是"a"

varchar存储数据时,会在数据前会用1~2Bytes显示后面的数据的长度,方便取。

vharchar 能支持的最大长度是65535 用于保存数据长度的数据最长两个bytes

3.3验证:

使用一个 char_length的函数 可以查看字符的长度

mysql> create table i1(a char(4),b varchar(4));
mysql> insert into i1 value(‘x‘,‘x‘);
mysql> select char_length(a),char_length(b) from i1;
+----------------+----------------+
| char_length(a) | char_length(b) |
+----------------+----------------+
|        1       |              1 |
+----------------+----------------+
#两个字段的长度都为1

3.4结论:

这是因为,mysql在存储时,自动加上的空格,对使用者而言是没有意义的,所以mysql自动帮你处理空格了,我们可以设置sql模式 来让它现出原形。

mysql> set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES";

设置完成后重启msyql 再次查询长度

mysql> select char_length(a),char_length(b) from i1;
+----------------+----------------+
| char_length(a) | char_length(b) |
+----------------+----------------+
|              4 |              1 |
+----------------+----------------+

3.5注意:

当你在执行这样的查询语句时 mysql会自动将参数末尾的空格去除

mysql> select *from i1 where name = "xcq     ";
+------+------------+
| id   | name       |
+------+------------+
|    1 | xcq        |
+------+------------+

当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 %

mysql> select *from i1 where name like "xcq%";
+------+------------+
| id   | name       |
+------+------------+
|    1 | xcq        |
+------+------------+
1 row in set (0.00 sec)

mysql> select *from i1 where name like "xcq";
Empty set (0.00 sec)
#  % 任意个数的任意字符
#  _ 1个任意字符

4.时间和日期

4.1time

时分秒 HH:MM:SS

#手动输入时分秒
mysql> create table i1 (a time);

mysql> insert into i1 value(‘19:32:56‘);

mysql> select *from i1;
+----------+
| a        |
+----------+
| 19:32:56 |
+----------+

#也可以用now()来获取当前年月日时分秒
mysql> insert into i1 value(now());

mysql> select *from i1;
+----------+
| a        |
+----------+
| 19:33:41 |
+----------+

4.2year

年份

#手动输入年份
mysql> create table i1 (a year);

mysql> insert into i1 value(‘2019‘);

mysql> select *from i1;
+------+
| a    |
+------+
| 2019 |
+------+

#通过now()获取当前年月日时分秒
mysql> insert into i1 value(now());

mysql> select *from i1;
+------+
| a    |
+------+
| 2018 |
+------+

4.3date

日期 年月日

#手动输入年月日
mysql> create table i1 (a date);

mysql> insert into i1 value(‘2019-1-1‘);

mysql> select *from i1;
+------------+
| a          |
+------------+
| 2019-01-01 |
+------------+

#通过now()获取当前年月日时分秒
mysql> insert into i1 value(now());

mysql> select *from i1;
+------------+
| a          |
+------------+
| 2018-09-12 |
+------------+

4.4 datetime和timestamp

日期加时间 年月日 时分秒 年份最大是9999

时间戳 从1970-1-1开始算 年份最大是2037

#手动输入年月日 时分秒
mysql> create table i1 (a datetime);#timestamp

mysql> insert into i1 value(‘2019-1-1 1:1:1‘);

mysql> select *from i1;
+---------------------+
| a                   |
+---------------------+
| 2019-01-01 01:01:01 |
+---------------------+

#通过now()获取当前年月日时分秒
mysql> insert into i1 value(now());

mysql> select *from i1;
+---------------------+
| a                   |
+---------------------+
| 2018-09-12 19:43:36 |
+---------------------+

4.5总结:

共同点: 时间的存取通过字符串类型

    都可以使用now()函数来插入当前时间

    datetime 和 时间戳都能够表示日期和时间

不同之处是: 年份最大范围不同

      时间戳可以为空 代表当前时间

      时间戳在你更新记录时 会自动更新为当前时间

5.枚举和集合

5.1枚举

enum,提前设置?个范围 你的数据只能是 其中之?(多选?) 例如性别

#正确情况
mysql> create table i1 (id int,name char(10),sex enum(‘man‘,‘woman‘,‘othor‘))
mysql> insert into i1 value(1,‘sql‘,‘man‘);
mysql> select *from i1;
+------+------------+------+
| id   | name       | sex  |
+------+------------+------+
|    1 | sql        | man  |
+------+------------+------+

#错误示范:不能添加不在枚举里的字符
mysql> insert into i1 value(1,‘sql‘,‘123‘);#报错
ERROR 1064 (42000): You have an error in your SQL syntax
check the manual that corresponds to your
MySQL server version for the right syntax
to use near ‘mysql> insert into i1 value(1,‘sql‘,‘123‘)‘ at line 1

5.2集合

set,提前设置?个范围 你的数据只能是其 中?部分(多选多) 例如爱好

mysql> create table i1 (id int,name char(10),hobby set(‘eat‘,‘play‘,‘sleep‘));

mysql>  insert into i1 value(1,‘sql‘,‘eat,play‘);

mysql> select *from i1;
+------+------------+----------+
| id   | name       | hobby    |
+------+------------+----------+
|    1 | sql        | eat,play |
+------+------------+----------+

原文地址:https://www.cnblogs.com/ouyang99-/p/10354766.html

时间: 2024-12-17 13:42:04

02 数据库入门学习-数据类型的相关文章

数据库入门学习

一.初识数据库 1.数据库的由来 怎么才能把数据永久保存下来,根据我们以前的所学,文件处理就可以将数据永久存储. 但是文件处理有很大的问题 1.管理不方便 2.文件操作效率问题 3.一个程序不太可能仅运行在同一台电脑上 那么为了解决这些问题,采取了提高计算机性能的方式 1.垂直扩展 指的是更换性能更好的硬件 2.水平扩展 指的就是添加更多的计算机 把任务分配给每一台 (分布式计算) 分布式计算 的好处 1.其中某一台挂了 不会导致整个系统瘫痪 稳定性高 2.理论上性能可以无限扩展 基于分布式计算

06 数据库入门学习-视图、sql注入、事务、存储过程

一.视图 1.什么是视图 视图本质是一张虚拟的表 2.为什么要用 为了原表的安全 只要有两大功能 1.隐藏部分数据,开放指定数据 2.视图可以将查询结果保存,减少sql语句的次数 特点: 1.视图使用永久保存的,而且保存的仅仅是一条 as sql语句 2.每次对视图的查询,都是再次执行了保存的sql语句 3.对于视图的任何修改都会同步到原表 3.如何使用 语法: create view 视图名 as select * from 原表名; 验证:对视图的任何修改会改变原表  验证 二.sql注入

04 数据库入门学习-单表查询、多表查询、子查询

1.复制表 #创建了一张测试表 mysql>create table test (id int primary key auto_increment,name char(10)); #显示原表结构 mysql> desc test; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+---

05 数据库入门学习-正则表达式、用户管理、pymysql模块

一.正则表达式 正则表达式用于模糊查询,模糊查询已经讲过了 like 仅支持 % 和 _ 远没有正则表达式灵活当然绝大多数情况下 like足够使用 #语法 select *from table where name regexp "正则表达式"; #实例 #准备数据 create table emp (id int,name char(10),sex char,age int,dept_id int,job char(10),salary double); insert into em

03 数据库入门学习-完整性约束、关联关系

一.完整性约束 1.什么是约束 为了保证数据的合法性与完整性,对字段进行了除了数据类型以外添加额外的约束. 2.not null 2.1意义 not null是非空约束,数据不能为空 2.2语法 create table student (id int,name char(10) not null);#名字不能为空 3.default 3.1意义 default  默认值约束,可以指定字段的默认值 3.2语法 create table user (id int,name char(10) not

02 AppCan入门学习之弹性盒子模型

弹性盒子模型 效果: 一.弹性盒子模型 1. 流式布局 <!-- 流式布局--> <divstyle='display: inline;border: 1px solid orange'> <divstyle='display: inline;background: #66ccff'>流式文件左边</div> <divstyle='display: inline;background: #ffffff'>流式文件右边</div> &l

MongoDB入门学习(二):MongoDB的基本概念和数据类型

上一篇讲了MongoDB的安装和管理,其中涉及到了一些概念,数据结构还有一些API的调用,不知道的没关系,其实很简单,这篇会简单介绍一下. 1.文档 文档是MongoDB的核心概念,多个键值对有序的放在一起就是一个文档,文档是MongoDB存储数据最基本的数据结构.对MongoDB都是以文档的形式来操作的,使用了一种类似JSON的二进制BSON数据格式,对API的调用都是传的文档参数.每种编程语言都有标示文档的数据结构,比如java的map,lua的table,python的dict等等,但是都

《NOSQL数据库入门》学习笔记

<nosql数据库入门> 第1章 nosql数据库的基础知识 1 1.1 关系型数据库和nosql数据库 2 1.1.1 什么是nosql 2 1.1.2 关系型数据库简史 2 1.1.3 数据库的分类 3 1.1.4 关系型数据库的优势 5 1.1.5 关系型数据库的不足 5 1.1.6 nosql数据库 9 1.2 nosql数据库是什么 12 1.2.1 键值存储 13 1.2.2 面向文档的数据库 14 1.2.3 面向列的数据库 14 1.3 如何导入nosql数据库 16 1.3.

Python入门学习:1.变量和简单的数据类型

python入门学习:1.变量和简单的数据类型 关键点:变量.字符串.数字 1.1 变量的命名和使用1.2 字符串1.3 数字1.4 注释 1.1 变量的命名和使用 ??变量,顾名思义是一个可变的量,每个变量都存储一个值--与变量关联的信息. 1message = "hello world!"2# message 是一个变量3print(message) ??在python中使用变量时,需要遵循一些规则和指南. 变量名只能包含字母.数字和下划线.变量名可以字母或者下划线打头,但不能以数