【MySQL数据库】数据类型详解

发布于:2025-04-19 ⋅ 阅读:(20) ⋅ 点赞:(0)

数据类型

在这里插入图片描述

tinyint类型(整形)

例:

mysql> create table tt1(num tinyint);

mysql> insert  into tt1 values(1);

mysql> insert  into tt1 values(128); -- 越界插入,报错
ERROR 1264 (22003): Out of range value for column 'num' at row 1

mysql> select * from tt1;

 +------+
 | num  |
 +------+
 |  1   |
 +------+
 1 row in set (0.00 sec)
  • 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
  • 可以通过UNSIGNED来说明某个字段是无符号的
 mysql> create table tt2(num tinyint unsigned);

 mysql> insert into tt2 values(-1); -- 无符号,范围是: 0 - 255
 
 ERROR 1264 (22003): Out of range value for column 'num' at row 1
 
 mysql> insert into tt2 values(255);
 
 Query OK, 1 row affected (0.02 sec)
 
 mysql> select * from tt2;
 
 +------+
 | num  |
 +------+
 | 255  |
 +------+
 1 row in set (0.00 sec)

bit类型

bit[(M)]

位字段类型

M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。

  • bit字段在显示时,是按照ASCII码对应的值显示。
 mysql> insert into tt4 values(65, 65);

 mysql> select * from tt4;
 +------+------+
 | id   | a    |
 +------+------+
 |   10 |      |   
 |   65 | A    |
 +------+------+

如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间

小数

浮点数 float、double

float[(m, d)] [unsigned]

M指定显示长度

d指定小数位数,占用空间4个字节

  • 如float(4,2)表示的范围是-99.99 ~ 99.99
  • MySQL在保存值时会进行四舍五入,四舍五入超过范围则会失败
 mysql> create table tt6(id int, salary float(4,2));
 Query OK, 0 rows affected (0.01 sec)
 
 mysql> insert into tt6 values(100, -99.99);
 Query OK, 1 row affected (0.00 sec)
 
 mysql> insert into tt6 values(101, -99.991);
 Query OK, 1 row affected (0.00 sec)

 mysql> select * from tt6;
 +------+--------+
 | id   | salary |
 +------+--------+
 |  100 | -99.99 |
 |  101 | -99.99 |
 +------+--------+
 2 rows in set (0.00 sec)
  • double与float类似,只是精度更高,占8字节

decimal

decimal(m, d) [unsigned]

定点数m指定长度,d表示小数点的位数

  • decimal和float区别:

float和decimal表示的精度不一样

 mysql> create table tt8 ( id int, salary float(10,8), salary2 decimal(10,8));
 
 mysql> insert into tt8 values(100,23.12345612, 23.12345612);
 
 mysql> create table tt8 ( id int, salary float(10,8), salary2  decimal(10,8));

 mysql> select * from tt8;
 
+------+-------------+-------------+
| id   | salary      | salary2     |
+------+-------------+-------------+
|  100 | 23.12345695 | 23.12345612 |
+------+-------------+-------------+
  • float表示的精度大约是7位
  • decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10
  • 如果希望小数的精度高,可以使用decimal

字符串类型

char

char(L): 

固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

  • 注意:MySQL中的字符和我们在语言中学的字符是不一样的,语言中的字符指的是一个字节的数据,但MySQL中的字符就真的代表一个字符,无论你是‘a’还是‘中’,都是一个字符
 mysql> create table tt9(id int, name char(2));

 mysql> insert into tt9 values(100, 'ab');

 mysql> insert into tt9 values(101, '中国');
 
 mysql> insert into tt9 values(101, '中');
 
 mysql> select * from tt9;
+------+--------+
| id   | name   |
+------+--------+
|  100 | ab     |
|  101 | 中国   |
|  101 ||
+------+--------+

varchar

varchar(L)

可变长度字符串

L表示字符长度,最大长度65535个字节,注意单位是字节,char,单位是字符

mysql> create table tt10(id int ,name varchar(6)); --表示这里可以存放6个字符

mysql> insert into tt10 values(100, 'hello'); 

mysql> insert into tt10 values(100, '我爱你,中国');

 mysql> select * from tt10;
 +------+--------------------+
 | id   | name               |
 +------+--------------------+
 |  100 | hello              |
 |  100 | 我爱你,中国         |
 +------+--------------------+ 

char与varchar的比较

  • char是定长的,你定义多长他就会分配多大的空间
  • varchar是可变的,你定义的只是它的上限,实际上它的空间会根据的数据的大小而变化,也就是给多少用多少

那在平时我们该如何选择使用哪一种呢?

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

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

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

在这里插入图片描述

日期时间类型

date

‘yyyy-mm-dd’ ,占用三字节

datetime 

时间日期格式
‘yyyy-mm-dd HH:ii:ss’
表示范围从1000 到 9999 ,占用八字节

timestamp

时间戳,从1970年开始
yyyy-mm-dd HH:ii:ss
格式和datetime 完全一致,占用四字节

  • timetamp 在使用时会自动更新,其他两个需要外部插入
//建表
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp);
 
Query OK, 0 rows affected (0.01 sec)
 
 //插入数据:
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1'); 
--插入两种时间

Query OK, 1 row affected (0.00 sec)

mysql> select * from birthday;

 +------------+---------------------+---------------------+
 | t1         | t2                  | t3                  |
 +------------+---------------------+---------------------+
 | 1997-07-01 | 2008-08-08 12:01:01 | 2017-11-12 18:28:55 | 
 +------------+---------------------+---------------------+
 --添加数据时,时间戳自动补上当前时间
 //更新数据:
mysql> update birthday set t1='2000-1-1';

Query OK, 1 row affected (0.00 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from birthday;
 +------------+---------------------+---------------------+
 | t1         | t2                  | t3                  |
 +------------+---------------------+---------------------+
 | 2000-01-01 | 2008-08-08 12:01:01 | 2017-11-12 18:32:09 | 
 +------------+---------------------+---------------------+
-- 更新数据,时间戳会更新成当前时间

enum和set

enum

枚举类型
enum(‘选项1’,‘选项2’,‘选项3’,…);
多选一类型

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值

而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;

当我们添加枚举值时,也可以添加对应的数字编号。

set

集合,“多选”类型;
set(‘选项值1’,‘选项值2’,‘选项值3’, …);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值

而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,… 最多64个。

  • enum中只能插入枚举类型中的数据,不能插入枚举类型没有的数据,字符或下标(从1开始)插入都行

  • set同样也只能插入原有的数据,不过可以选择单个或者多个一起插入

  • 注意,enum中可以使用下标插入,但是set中是以位图的方式插入的,如:2的二进制为00010,所以我们插入的是第二个数据

  • 数据可以为NULL,也可以是空串

下面是一个调查表实例,调查人的喜好与性别:

mysql> create table votes(-> username varchar(30),
-> hobby set('登山','游泳','篮球','武术'),
-> gender enum('男','女'));    

Query OK, 0 rows affected (0.02 sec)


insert into votes values('雷锋', '登山,武术', '男');

insert into votes values('Juse','登山,武术',2);

//插入数据
select * from votes where gender=2;

 +----------+---------------+--------+
 | username | hobby         | gender |
 +----------+---------------+--------+
 | Juse     | 登山,武术      ||
 +----------+---------------+--------+

查询筛选语句:

1.enum

 select * from votes where .......
mysql> select * from votes where gender='男';
 +----------+--------+--------+
 | username | hobby  | gender |
 +----------+--------+--------+
 | LiLei    | 登山   ||
 +----------+--------+--------+

2.set
find_ in_ set函数

在一个集合中查找某一个元素是否存在,返回值为对应的下标

mysql> select find_in_set('a', 'a,b,c');

mysql> select find_in_set('a', 'a,b,c');
 +---------------------------+
 | find_in_set('a', 'a,b,c') |
 +---------------------------+
 |                         1 |
 +---------------------------+

所以我们查找时可以用该函数的返回值充当where的判断值

mysql> select * from votes where find_in_set('登山', hobby);

找多个

mysql> select * from votes where find_in_set('登山', hobby) and find_in_set('羽毛球', hobby);

总结

其实数据类型就是MySQL中的一种天然的约束,满足就可以插入


网站公告

今日签到

点亮在社区的每一天
去签到