您的位置:首页 > 数据库 > MySQL

MySQL的数据类型学习笔记

2016-12-23 22:13 218 查看

MySQL的数据类型

整型

1. tinyint

大小相当于c的char类型,1个字节,它有一个别名叫bool两者大小相同

tinyint表示范围:-128 - 127
tinyint unsigned表示范围:0 - 255


2. smallint

大小相当于c的short类型,2个字节

smallint表示范围:-32768 - 32767
smallint unsigned表示范围:0-65535


3. mediumint

大小为3个字节

mediumint表示范围:-8388608 - 8388607

mediumint unsigned表示范围:0-16777215

4. int

大小相当于c的int,4个字节

int表示范围:-2147483648 - 2147483637

int unsigned表示范围:4294967295

5.bigint

相当于long long类型,8个字节

biging表示范围:(-9,223,372,036,854,775,808 - 9,223,372,036,854,775,807

bigint unsigned表示范围:0~18446744073709551615

6. 测试一下:

//创建一个表有tinyint类型数据
create table type ( a tinyint, b tinyint unsigned);
//插入一个符合的值
mysql> insert into type values(100, 200);
Query OK, 1 row affected (0.40 sec)
//插入不符合的值,报错。
mysql> insert into type values(-129, 200);
ERROR 1264 (22003): Out of range value for column 'a' at row 1
mysql> insert into type values(100, -1);
ERROR 1264 (22003): Out of range value for column 'b' at row 1


7. 整型的显示宽度和填零(zerofill)

//显示宽度最小为4位
create table temp(i int(4) zerofill);
//当不足四位,用0来填充四位
insert into temp values(88);
//当超过四位,就正常显示
insert into temp values(123456);
//最后结果
mysql> select * from temp;
+--------+
| i      |
+--------+
|   0088 |
| 123456 |
+--------+


浮点型

1. float和double类型

遵循IEEE 745浮点数表示

S:符号位
E:指数位
M:尾数位,也叫有效位数位
N:(-1)^S × M × 2^E


- 单精度4个字节,32位,取值范围:-3.402823466E+38~3.402823466E

- 双精度8个字节,64位,取值范围:-1.7976931348623157E+308~1.7976931348623157E+308

float类型,精度6位。

double类型,精度17位。double有一个别名叫real

精度就是有效数字的个数,并不代表能表示的最大个数

2. 测试一下:

create table number(a float, b double);
//插入一个数据
insert into number values(123456789.123456789, 123456789.123456758888);
//显示结果,float能够表示6位有效数字,double能表示17位,并且精度位四舍五入。
+-----------+--------------------+
| a         | b                  |
+-----------+--------------------+
| 123457000 | 123456789.12345676 |
+-----------+--------------------+


3. 浮点数的显示宽度和填零(zerofill)

float(m, d)unsigned zerofill
m表示总位数,d是小数点后的位数


//5位数,两位小数点的float类型,其表示范围为999.99 ~  -999.99
create table teat(f float(5, 2));

insert into teat values(-999.99);
insert into teat values(999.99);
//超出位数遵循四舍五入的原则
mysql> insert into teat values(-999.999);
ERROR 1264 (22003): Out of range value for column 'f' at row 1
mysql> insert into teat values(-999.994);//插入成功
Query OK, 1 row affected (0.13 sec)


4. decimal类型

decimal(m,d)unsigned zerofill
1. m表示总位数,d是小数点后的位数,m和d可以缺省,默认分别是10和0。
2. decimal**取值范围与double是一样的**,但是有**更高的精度**。
3. numeric是decimal的别名


测试一下:

//最大30位,最多10个小数位,不足10位用0补足。
create table num(dec decimal(30, 10));
//插入数据并查看结果
insert into num values(123456789.123456789);
mysql> select * from num;
+----------------------+
| d                    |
+----------------------+
| 123456789.1234567890 |
+----------------------+
1 row in set (0.00 sec)


日期和时间

datetime类型

显示格式:YYYY-MM-DD HH:MM:SS
取值范围:’1000-01-01 00:00:00’到’9999-12-31 23:59:59’
空间大小:8字节
例子:
create table mytime(time datetime);
insert into mytime values('2016-12-23 18:04:38');//插入一个正常值
insert into mytime values('9999-12-31 23:59:59');//插入最大值
insert into mytime values('0000-01-01 00:00:00');//插入一个比其范围小的年值也可以成功,但是MySQL并**不保证这类不在范围的值正常工作。
insert into mytime values('99-01-01 00:00:00');//插入一个年值如果为两位数,则MySQL根据一下规则解释:

- 70 ~ 99范围的年值转换为1979~1999;
- 00 ~ 69范围的年值转换为2000~2069;

mysql> insert into mytime values('10000-01-01 00:00:00');//插入大于其范围的值会出错
ERROR 1292 (22007): Incorrect datetime value: '10000-01-01 00:00:00' for column 'time' at row 1

mysql> select * from mytime;
+---------------------+
| time                |
+---------------------+
| 2016-12-23 18:04:38 |
| 9999-12-31 23:59:59 |
| 0000-01-01 00:00:00 |
| 1999-01-01 00:00:00 |
+---------------------+


timestamp类型

显示格式:YYYY-MM-DD HH:MM:SS
取值范围:‘1970-01-01 00:00:00’到2038-01-19 03:14:07’
空间大小:4字节
例子:
create table timestamp(t timestamp);
insert into timestamp values('2038-01-19 03:14:07');//插入一个时间,由于存在时区问题,所以timestamp能表示的最大时间应该在加上8个小时
insert into timestamp values('2038-01-19 11:14:07');//插入范围上限的值,可以成功

mysql> insert into timestamp values('2038-01-19 11:14:08');//插入超出范围的值出错
ERROR 1292 (22007): Incorrect datetime value: '2038-01-19 11:14:08' for column 't' at row 1

mysql> select * from timestamp;
+---------------------+
| t                   |
+---------------------+
| 2038-01-19 03:14:07 |
| 2038-01-19 11:14:07 |
+---------------------+


date类型

显示格式:YYYY-MM-DD
取值范围:’1000-01-01’到’9999-12-31’
空间大小:3字节

date类型和datetime类型相似,不存储时分秒,和datetime都有不保证小于其范围的值正常工作。


time类型

显示格式:HH:MM:SS
取值范围:‘-838:59:59’到’838:59:59’
空间大小:3字节
time类型能够取到负数范围,所以可以用来表示时间差。
例子:
insert into t_time values('-35:32:53');//插入一个负值
insert into t_time values('1 00:32:53');//在小时前可以插入一个天数,它会换算成小时

mysql> select * from t_time;
+-----------+
| t         |
+-----------+
| -35:32:53 |
| 24:32:53  |   //被换算成的time值
+-----------+


year类型

显示格式:YYYY
取值范围:1901到2155
空间大小:1字节

year类型的数据在插入时可以以整数的形式插入,也可以以字符串类型插入,不能超过其范围。


字符串类型

char和varchar类型

char(M)
varchar(M)
M表示的是字符数

CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。


char(4)存储需求varchar(4)存储需求
“”4字节1个字节
“ab”‘ab’4字节‘ab’3个字节
“abcd”‘abcd’4字节‘abcd’5个字节
“abcdefgh”‘abcd’4字节‘abcd’5个字节
varchar存储值时,需要用一个字节来储存串的长度。

binary和varbinary类型

BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。


text类型

text分为四种
1. tinytext     存储需求:L+1个字节,其中L < 2^8
2. text         存储需求:L+2个字节,其中L < 2^16
3. mediumtext   存储需求:L+3个字节,其中L < 2^24
4. longtext     存储需求:L+4个字节,其中L < 2^32

VARCHAR、BLOB和TEXT类是变长类型。每个类型的存储需求取决于列值的实际长度(用前面的表中的L表示),而不是该类型的最大可能的大小。例如,VARCHAR(10)列可以容纳最大长度为10的字符串。实际存储需求是字符串(L)的长度,加上一个记录字符串长度的字节。对于字符串'abcd',L是4,存储需要5个字节。

对于CHAR、VARCHAR和TEXT类型,前面的表中的值L和M应解释为字符数目,并且列定义中的这些类型的长度表示字符数目。例如,要想保存一个TINYTEXT值需要L字符+ 1个字节。


enum类型

//枚举类型只能插入枚举类型中含有的字符串
create table t_enum(sex enum('male', 'female'));
insert into t_enum values('male');
insert into t_enum values('female');

mysql> insert into t_enum values('other');//插入其他的字符串会戳错
ERROR 1265 (01000): Data truncated for column 'sex' at row 1

insert into t_enum values(1);//插入整型数字也可以,1与第一个字符串对应,实际上MySQL中保存的是整数。

mysql> select sex+0 from t_enum;
+-------+
| sex+0 |
+-------+
|     1 |
|     2 |
|     1 |
+-------+
enum最多65535个值


set类型

sei类型是按位存取的

create table fruit_table(fruit set('apple', 'banana', 'orange'));//apple二进制代表1,banana二进制代表10,orange二进制代表100。
insert into fruit_table values('apple,banana');//插入的字符串不能有空格,插入'apple,banana'相当与插入二进制11,十进制则为3
insert into fruit_table values('apple,orange');//插入'apple,orange'相当于插入二进制101,十进制则为5

mysql> select fruit+0 from fruit_table;
+---------+
| fruit+0 |
+---------+
|       3 |
|       5 |
+---------+
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql c语言 数据