MySQL数据类型

Posted ych9527

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL数据类型相关的知识,希望对你有一定的参考价值。

1.数据类型总体介绍

所谓的数据类型:对数据进行统一的分类。从系统的角度出发,是为了使用统一的方式进行管理,更好的利用有限的空间。SQL中将数据类型分了三大类:数值类型、字符串类型和时间日期类型

image-20210629161320373

2.tinyint

1.tinyint -> 中文意思,非常小的整数,这个整数占一个字节,表示的范围为 -128~127

2.一般插入数据时,即是超过了范围,也不会报错,只是会发生截断,因此需要在/etc/my.cnt中的mysqld标签下增加 sql_mode=‘STRICT_ALL_TABLES’,增强数据库对插入范围的校验,设置之后重启数据库

3.如果在设计数据库表字段的时候,设计到整形数据,尽量不要使用tinyint,而是用表示范围更大的类型,发展性眼观,为后续预留

4.对于整形数据,尽量少用unsigned,因为一个小的数字减去一个大的数字,有可能会导致查询结果出错,因此无符号表示不了负数

image-20210629165947582

2.BIT类型

1.BIT类型的值是按照ASCII码来表示的

2.如果只想存储0或者1,则BIT类型的比特位数设置称为1

image-20210629172724671

3.小数类型

1.type(m,d):m指定长度,d指定小数点后的位数

2.float占用4字节

3.double占用8字节,比float精度更高

4.decimal,精度更高

image-20210629183757985

4.字符类型

1.char(L):固定长度的字符串,L不是占用字节的大小,而是字符串的长度;字符占用字节的数量和数据库的编码格式息息相关;

比如:LATIN1:1个字符占用1个字节,utf8:1个字符占用3个字节

比如在utf8格式下,char(10)占用的字节数为 3*10=30字节

2.varchar(L):可变长度的字符串,L表示字符长度;到底可以存储多少个字符,和数据库的编码息息相关;

理论上的长度为65535个字符,如果编码格式表示的字符是用n个字节来表示的,那么字符串的理论长度为(65535-(1~3))/n。比如在utf8格式下,最大长度为 (65535-3)/3=21844

3.固定长度字符串和可变长度字符串区别:

1.对于char而言,定义之后就开辟好了空间,对varchar而言,在定义的范围之内,存储多少字符串,就开辟多大的空间

2.varchar不可以超过设定的长度L

3.varchar类型需要用到1-3个字节来保存字符串的长度,

image-20210629185940111

//创建数据库,字符集设置为utf8
MariaDB [(none)]> create database test4  charset= utf8;
Query OK, 1 row affected (0.00 sec)

//创建一个数据表,设置两个列,类型分别为char 和 varchar
MariaDB [test4]> create table t1 (name1 char(6),name2 varchar(6));
Query OK, 0 rows affected (0.01 sec)

//此时,char用了3*4=12字节,定义的时候就开辟好了
//varchar,使用的字节数为3*3=9字节,动态开辟的
MariaDB [test4]> insert into t1 values(123,123);
Query OK, 1 row affected (0.00 sec)

//下列代码验证了,两者皆不可超过设定的长度
MariaDB [test4]> insert into t1 values(1234567,123);
ERROR 1406 (22001): Data too long for column 'name1' at row 1
MariaDB [test4]> insert into t1 values(123,1234567);
ERROR 1406 (22001): Data too long for column 'name2' at row 1

image-20210629191153540

如何选择定长或变长字符串?

如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号

如果数据长度有变化,就使用变长(varchar),比如:名字,地址,但是你要保证最长的能存的进去。

定长的磁盘空间比较浪费,但是效率高。变长的磁盘空间比较节省,但是效率低。

5.日期和时间类型

1.datetime:时间日期类型,YYY-MMM-DDD HH:mm:SS。这个类型需要操作者手动插入时间

2.date类型只表示年月日,占用三个字节

3.timestamp:时间戳类型,从1970年开始,表示的年月日,时分秒 YYY-MMM-DDD HH:mm:SS。这个可以自己计算当中的时间

//timestamp可以自动生成时间

MariaDB [test4]> create table t3(name char(8),DTtime datetime,DAtime date,DPtime timestamp);
Query OK, 0 rows affected (0.00 sec)

MariaDB [test4]> insert into t3 (name) values("李四");
Query OK, 1 row affected (0.00 sec)

MariaDB [test4]> select * from t3;
+--------+--------+--------+---------------------+
| name   | DTtime | DAtime | DPtime              |
+--------+--------+--------+---------------------+
| 李四   | NULL   | NULL   | 2021-06-29 19:26:00 |
+--------+--------+--------+---------------------+

//手动插入时间

MariaDB [test4]> insert into t3 values('李四','2021-06-29 19:27:00','2021-06-29','2021-06-29 19:27:00');
Query OK, 1 row affected (0.00 sec)

MariaDB [test4]> select * from t3;
+--------+---------------------+------------+---------------------+
| name   | DTtime              | DAtime     | DPtime              |
+--------+---------------------+------------+---------------------+
| 李四   | NULL                | NULL       | 2021-06-29 19:26:00 |
| 李四   | 2021-06-29 19:27:00 | 2021-06-29 | 2021-06-29 19:27:00 |
+--------+---------------------+------------+---------------------+

image-20210629193144185

6.enum、set

1.enum:

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是"数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3….最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

枚举了很多值,但是只能在其中选择一个,如果插入的值不再枚举列表之中,就会报错

2.set:

该设定只是提供了若干个选项的值,最终一个单元格中,可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是"数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3….最多64个。

列举出来了很多值,可以在其中选择多个值,进行组合,插入的值不在其中,就会报错

//创建表
MariaDB [test4]> create table t9(name char(10),fruit set('香蕉','菠萝','哈密瓜'),sex enum('男','女'));

//汉字插入
MariaDB [test4]> insert into t9 values('张三','菠萝,哈密瓜','男');

//用序号插入
MariaDB [test4]> insert into t9 values('小红','1','2');

MariaDB [test4]> select * from t9;
+--------+------------------+------+
| name   | fruit            | sex  |
+--------+------------------+------+
| 张三   | 菠萝,哈密瓜       | 男   |
| 小红   | 香蕉             | 女   |
+--------+------------------+------+

集合查询使用find_in_set函数

image-20210629200122464

MariaDB [test4]> select * from t9;
+--------+------------------+------+
| name   | fruit            | sex  |
+--------+------------------+------+
| 张三   | 菠萝,哈密瓜       | 男   |
| 小红   | 香蕉             | 女   |
+--------+------------------+------+

//在展示的集合之中,寻找'菠萝'
MariaDB [test4]> select *from t9 where find_in_set('菠萝',fruit);
+--------+------------------+------+
| name   | fruit            | sex  |
+--------+------------------+------+
| 张三   | 菠萝,哈密瓜        | 男   |
+--------+------------------+------+

//展示的集合为表t9的名字列和水果列,并且从中寻找'菠萝',where相当于衔接
MariaDB [test4]> select name,fruit from t9 where find_in_set('菠萝',fruit);
+--------+------------------+
| name   | fruit            |
+--------+------------------+
| 张三   | 菠萝,哈密瓜        |
+--------+------------------+


以上是关于MySQL数据类型的主要内容,如果未能解决你的问题,请参考以下文章

在代码片段中包含类型转换

对这个带有 & 不带 = 的代码片段返回类型感到非常困惑

从mysql的片段中加载ListView

硬核!管理mysql数据库的工具

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段