目录
数据类型
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中的一种天然的约束,满足就可以插入