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

数据类型和运算符(一)

2015-07-08 20:27 666 查看
Mysql支持多种数据类型:包括数值类、日期/日期类型、字符串类型

数值数据类型:整数类型 tinyint smallint mediumint int bigint 、浮点小数类型 float double 、定点小数类型 decimal

日期/时间类型:year time date datetime timestamp

字符串类型: char varchar binary varbinary blob text enum set

整数类型的属性字段可以添加auto_increment自增约束条件

mysql中整数的数据类型的存储大小为:

类型名字                     存储需求
tinyint                     1个字节
smallint                    2个字节
mediumint                   3个字节
int(integer)                4个字节
bigint                      8个字节


tinyint的最大值(无符号)2^8-1

mysql> desc tb8;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
| dp    | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+


上面的int(11)里面的11代表的是该数据类型指定的显示的宽度,指定讷讷够显示的数值中数字的个数。

如 year int(4)表示的是在year字段中的数据一般只显示4位数字的宽度

在这里要注意的是::显示宽度和数据类型的取值范围是无关的。显示宽度只是指明mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格来填充;如果插入了大于显示宽度的值,只要这个值不超过该类型整数的取值范围,数值仍然可以显示出来。

如果不指定数据类型,系统会为整数类型指定默认的宽度

mysql> create table tb7
-> (
->     a tinyint,
->     b smallint,
->     c mediumint,
->     d int,
->     e bigint
-> );
Query OK, 0 rows affected (0.13 sec)

mysql> desc tb7;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| a     | tinyint(4)   | YES  |     | NULL    |       |
| b     | smallint(6)  | YES  |     | NULL    |       |
| c     | mediumint(9) | YES  |     | NULL    |       |
| d     | int(11)      | YES  |     | NULL    |       |
| e     | bigint(20)   | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
5 rows in set (0.01 sec)


这里的tinyint为什么是4呢?因为要显示的数据是从-128到127的,加上-号就是4位来显示

类型名称                        存储需求
float                       4个字节
double                      8个字节
decimal(M,D),dec            M+2个字节


其中M称为精度,表示总共的位数,N称为标度,表示小数的位数

不论是定点还是浮点,如果用户指定的精度超出精度范围,就会四舍五入进行处理

mysql> create table tb9
-> (
->     x float(5,1),
->     y double(5,1),
->     z decimal(5,1)
-> );
Query OK, 0 rows affected (0.05 sec)

mysql> insert into tb9 values(5.12,5.15,5.123);
Query OK, 1 row affected, 1 warning (0.22 sec)

mysql> show warnings;
+-------+------+----------------------------------------+
| Level | Code | Message                                |
+-------+------+----------------------------------------+
| Note  | 1265 | Data truncated for column 'z' at row 1 |
+-------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql> select * from tb9;
+------+------+------+
| x    | y    | z    |
+------+------+------+
|  5.1 |  5.2 |  5.1 |
+------+------+------+
1 row in set (0.05 sec)


float和double在不指定精度的时候,默认会按照实际的精度,decimal如果不指定精度会默认为(10,0)

日期与时间类型

类型名称                    日期范围                                        存储需求(字节)
year                    1901-2155                                   1
time                    -838:59:59~838:59:59                           3
date                    1000-01-01~9999-12-3                           3
datetime                1000-01-01 00:00:00~9999-12-31  23:59:59       8


year:

以2位字符串格式表示的year,范围从00到99,00到69表示2000-2069,70-99表示1970-1999, 0与00相同,插入超过取值范围的值将会被转换为2000

以2位数字表示的year,范围为1—99(和上面的相同),但是0在这里代表的却是0000,而不是2000

mysql> create table tb10
-> (
->    y year
-> );
Query OK, 0 rows affected (0.08 sec)

mysql> insert into tb10 values(2010);
Query OK, 1 row affected (0.03 sec)

mysql> select * from tb10;
+------+
| y    |
+------+
| 2010 |
+------+
1 row in set (0.00 sec)

mysql> insert into tb10 values('2010');
Query OK, 1 row affected (0.03 sec)

mysql> insert into tb10 values(2156);
ERROR 1264 (22003): Out of range value for column 'y' at row


下面是一些需要主要的输入

mysql> insert into tb10 values(0),('0'),('00'),('12'),('99');
Query OK, 5 rows affected (0.05 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from tb10;
+------+
| y    |
+------+
| 2010 |
| 2010 |
| 0000 |
| 2000 |
| 2000 |
| 2012 |
| 1999 |
+------+
//这里要注意当输入数字0,字符0,数字和字符1-99的情况


time

需要3个字节,格式:hh:mm:ss 范围 -838:59:59—–838:59:59

指定格式:

1  D HH:MM:SS D可以取0-34之间的值

2 HHMMSS 要求是这个时间要有意义 129912没有意义

mysql> create table tb11
-> (
->    t time
-> );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into tb11  values('10:05:05'),('23:23'),('2 10:10')
-> ,('3 02'),('12');
Query OK, 5 rows affected (0.05 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from tb11;
+----------+
| t        |
+----------+
| 10:05:05 |
| 23:23:00 |
| 58:10:00 |
| 74:00:00 |
| 00:00:12 |
+----------+
5 rows in set (0.00 sec)


在使用’D HH‘格式的时候,小时一定要使用双位数值,如果是小于10的要在前面加上0

向表中插入系统当前时间

mysql> insert into tb11 values(current_time),(now());
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0
//两者都是插入系统当前时间,是相同的


date

mysql> create table tb12
-> (
->    d date
-> );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into tb12 values('1994-02-28'),('20001010');
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from tb12;
+------------+
| d          |
+------------+
| 1994-02-28 |
| 2000-10-10 |
+------------+
2 rows in set (0.00 sec)


向表中插入系统当前时间

mysql> insert into tb12 values(current_date),(now());
Query OK, 2 rows affected, 1 warning (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 1

mysql> select * from tb12;
+------------+
| d          |
+------------+
| 1994-02-28 |
| 2000-10-10 |
| 2015-07-08 |
| 2015-07-08 |
+------------+
4 rows in set (0.00 sec)


current_date只是返回当前日期值,不包括时间部分,但是now()函数返回日期和时间值,在保存到数据库的时候,只是保留了日期部分

mysql允许不严格的语法:任何标点符号都可以用作日期部分之间的分隔符。 例如‘98-11-31’‘98.11.31’‘98@11@31’这些都是等价的

datetime以及timestamp暂时不考虑
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql