目录
- 数据类型
- tinyint类型(整形)
- bit类型
- 小数
- 浮点数 float、double
- decimal
- 字符串类型
- char
- varchar
- char与varchar的比较
- 日期时间类型
- enum和set
- 总结
数据类型
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 1mysql> 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 - 255ERROR 1264 (22003): Out of range value for column 'num' at row 1mysql> 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: 0mysql> 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中的一种天然的约束,满足就可以插入