大数据兼云计算(王明龙)讲师-MYSQL-DAY05-数据类型

mysql列类型

mysql列类型分类
-------------------------------------------------------------------------------------------------------------------------------------------------------
mysql支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。

一、数字类型
-------------------------------------------------------------------------------------------------------------------------------------------------------
1、TINYINT
一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。

2、SMALLINT
一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。

3、MEDIUMINT
一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。

4、INT
一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。

5、INTEGER
这是INT的一个同义词。

6、BIGINT
一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。

7、FLOAT
一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。

8、DOUBLE
一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。

注意:
double 有效数字14位,float型有效数字7位,所以double精度高。
double 占内存 8 字节,float占内存 4 字节,float 省内存,运算速度快。
输入/输出格式 double 用 %lf, float 用 %f



二、日期和时间类型
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、DATE
一个日期。支持的范围是'1000-01-01''9999-12-31'。mysql> 以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。

2、DATETIME
一个日期和时间组合。支持的范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'。mysql> 以'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用
字符串或数字把值赋给DATETIME的列。

3、TIME
一个时间。范围是'-838:59:59''838:59:59'。mysql> 以'HH:MM:SS'格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。

4、YEAR
一个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069( 70-69)。mysql> 以YYYY格式来显示YEAR值,
但是允许你把使用字符串或数字值赋给YEAR列。




三、字符串类型
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1、CHAR(M)
一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是1 ~ 255个字符。当值被检索时,空格尾部被删除。


2、VARCHAR
一个变长字符串。注意:当值被存储时,尾部的空格被删除。


3、TINYTEXT
一个BLOB或TEXT列,最大长度为255(2^8-1)个字符。


4、TEXT
一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。


5、MEDIUMTEXT
一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。


6、LONGTEXT
一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符。



float(定点)
------------------------------------------------------------------------------------------------------------------
mysql> create table 表名(字段 float(5,3)); (5代表整个宽度,3代表小数点个数)
mysql> insert into 表名 set 字段=22.8888;   给记录赋值
mysql> select * from 表名;           查看表信息


decimal(浮点)
--------------------------------------------------------------------
mysql> create table 表名(字段 decimal(5,3));    (5代表整个宽度,3代表小数点个数)
mysql> insert into 表名 set 字段=22.8888;
mysql> select * from 表名;



float/double/decimal  区别
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
float       f = 345.98756f;--结果显示为345.9876,只显示7个有效位,对最后一位数四舍五入。
double    d=345.975423578631442d;--结果显示为345.975423578631,只显示15个有效位,对最后一位四舍五入。
--注:float和double的相乘操作,数字溢出不会报错,会有精度的损失。

decimal   dd=345.545454879.....--可以支持28位,对最后一位四舍五入。
--注:当对 decimal 类型进行操作时,数值会因溢出而报错。



char类型(以指定的数值个数存储数据)
-----------------------------------------------------------------------------------
mysql> create table t7(name char(3));    3为数值个数
mysql> insert into t7 set name="aaaaa";
mysql> select * from t7;
+------+
| name |
+------+
| aaa |
+------+
1 row in set (0.00 sec)


varchar类型(以实际数据存储数据)
-------------------------------------------------------------------
mysql> create table t7(name varchar(3));



enum类型(属于字符串类型)
----------------------------------------------------------------------
mysql> create table t8(name enum('a','b','c'));
mysql> insert into w5 set id="aaabbbbbcccc";
mysql> select * from w5;
+------+
| id  |
+------+
|   |
+------+
1 row in set (0.00 sec)
上面说明enum值必须是a或b或c的其中一个,否则输入不进去记录

mysql> insert into t8 set name="a";
mysql> select * from t8;
+------+
| name |
+------+
| a  |
+------+
1 row in set (0.00 sec)


set类型
---------------------------------------------------------------------
mysql> create table t8(name set('a','b','c'));
ERROR 1050 (42S01): Table 't8' already exists
mysql> create table t9(name set('a','b','c'));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into t9 set name="a,b";
Query OK, 1 row affected (0.00 sec)

mysql> select * from t9;
+------+
| name |
+------+
| a,b |
+------+
1 row in set (0.00 sec)


时间日期类型     now为当前时间,
--------------------------------------------------------------------------
time 111111
time 11:11:11
date 111111
date 11/11/11

timestamp时间串类型   now为当前时间,这里空值是当前时间
-------------------------------------------------------------------------------------- 


year类型
------------------------------------------------
09 --2009

0-69
70-99

mysql> create table t10(name year);
Query OK, 0 rows affected (0.04 sec)

mysql> insert into t9 set name=18;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> insert into t10 set name=18;
Query OK, 1 row affected (0.00 sec)

mysql> select * from t10;
+------+
| name |
+------+
| 2018 |
+------+
1 row in set (0.00 sec)

mysql> insert into t10 set name=70;
Query OK, 1 row affected (0.00 sec)

mysql> select * from t10;
+------+
| name |
+------+
| 2018 |
| 1970 |
+------+
2 rows in set (0.00 sec)

mysql> insert into t10 set name=2089;
Query OK, 1 row affected (0.00 sec)

mysql> select * from t10;
+------+
| name |
+------+
| 2018 |
| 1970 |
| 2089 |
+------+
3 rows in set (0.00 sec)

mysql> insert into t10 set name=1789;
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from t10;
datetime类型和timestamp时间戳类型,可以把当前的日期插入到他所修饰的字段里,年月日分钟小时秒

mysql> create table data8 (dt datetime,ts timestamp);

mysql> insert into data8 values('1999-01-01 10:10:10','1999-01-01 10:10:10'),(20010202121212,20010202121212);

mysql> select * from data8;
+---------------------+---------------------+
| dt         | ts         |
+---------------------+---------------------+
| 1999-01-01 10:10:10 | 1999-01-01 10:10:10 | 
| 2001-02-02 12:12:12 | 2001-02-02 12:12:12 | 
+---------------------+---------------------+
2 rows in set (0.00 sec)


now取当前时间
-----------------------
mysql> insert into data8 values(now(),null);显示当前日期
Query OK, 1 row affected (0.00 sec)

mysql> select * from data8;
+---------------------+---------------------+
| dt         | ts         |
+---------------------+---------------------+
| 1999-01-01 10:10:10 | 1999-01-01 10:10:10 | 
| 2001-02-02 12:12:12 | 2001-02-02 12:12:12 | 
| 2009-12-28 14:17:50 | 2009-12-28 14:17:50 | 
+---------------------+---------------------+
3 rows in set (0.00 sec)


[root@www ~]# date
2009年 12月 28日 星期一 14:18:21 CST

mysql> select * from data5;
+------------+
| d     |
+------------+
| 2009-12-20 | 
| 1998-01-01 | 
| 2008-10-10 | 
| 2002-08-08 | 
+------------+
4 rows in set (0.00 sec)

mysql> select year(d) from data5; 截取年份
+---------+
| year(d) |
+---------+
|  2009 | 
|  1998 | 
|  2008 | 
|  2002 | 
+---------+
4 rows in set (0.00 sec)

mysql> select month(d) from data5;截取月份
+----------+
| month(d) |
+----------+
|    12 | 
|    1 | 
|    10 | 
|    8 | 
+----------+
4 rows in set (0.00 sec)

mysql> select day(d) from data5;截取日
+--------+
| day(d) |
+--------+
|   20 | 
|   1 | 
|   10 | 
|   8 | 
+--------+
4 rows in set (0.00 sec)



mysql> select d from data5 where year(d)2000; 显示2000年之前的时间
+------------+
| d     |
+------------+
| 1998-01-01 | 
+------------+
1 row in set (0.00 sec)




enum(复合类型)枚举类型
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
mysql> create table data9 (gender enum('m','f'));  创建这种表的时候必须预先定义好值,插入值的时候,只能插入预先定义好的值

mysql> insert into data9 values('m'),('F'),('ab');

mysql> select * from data9;
+--------+
| gender |
+--------+
| m   | 
| f   | 
|    | 
+--------+
3 rows in set (0.00 sec)


mysql> select * from data9 where gender=2;索引定义的第2个值
+--------+
| gender |
+--------+
| f   | 
+--------+
1 row in set (0.01 sec)


mysql> select * from data9 where gender=1;索引定义的第一个值
+--------+
| gender |
+--------+
| m   | 
+--------+
1 row in set (0.00 sec)

mysql> select * from data9 where gender=0;错误的值的索引
+--------+
| gender |
+--------+
|    | 
+--------+
1 row in set (0.00 sec)



主要用于在一个表单里有性别的时候


set类型 跟enum差不多
enum 只能从事先定义好的值里选择一个值
但set不同

mysql> create table data10 (type set('a','b','c','d'));

mysql> insert into data10 values('a'),('a,b'),('a,e');

mysql> select * from data10;
+------+
| type |
+------+
| a  | 
| a,b | 
| a  | 
+------+
3 rows in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/wangminglong1989/article/details/81543379