MySQL基本数据类型

mysql中的数据类型

1 整数

类型 大小
tinyint 1 字节
smallint 2 字节
mediumint 3 字节
int 4 字节
bigint 8字节

1个字节就是8位,范围是有符号(-128, 127),有符号(0, 255),详情可见X位的有/无符号整数详细介绍

注意:默认情况整数是有符号的

设置为无符号的三种方式

  • 新建表的时候:create table 表名(字节名 tinyint unsigned);
  • 新建字节:alter table 表名 add 字节名 tinyint unsigned;
  • 修改字节:alter table 表名 modify 字节名 tinyint unsigned;
# 测试整数默认情况下有无符号
mysql> create table t1(id tinyint);
# 严格模式就会报错,非严格模式就会保存成127,说明是有符号的
mysql> insert into t1 values(200);

# 指定长度
mysql> create table t2(id int(10) zerofill);
mysql> insert into t2 values(1);
mysql> select * from t2;
+------------+
| id         |
+------------+
| 0000000001 |
+------------+
1 row in set (0.01 sec)

# int(10) 如果你的数据不足10位,用0填充(需要添加zerofill 这个约束)
# 对于整数和小数而言,都是用来控制显示填充的最小长度

2 浮点数

类型 大小 精确程度
float 4字节 不精确(大约5位小数)
double 8字节 不精确(比float更加精确)
decimal 需要指定 精确(65, 30)
# float
mysql> create table t3(id float);
mysql> insert into t3 values(1.2222222222);
mysql> select * from t3;
+---------+
| id      |
+---------+
| 1.22222 |
+---------+
1 row in set (0.00 sec)

# double
mysql> create table t4(id double);
mysql> insert into t4 values(1.22222222222222222);
mysql> select * from t4;
+--------------------+
| id                 |
+--------------------+
| 1.2222222222222223 |
+--------------------+
1 row in set (0.00 sec)

# decimal(4, 3): 一共有4位,小数部分占3位
mysql> create table t5(id decimal(4, 3));
mysql> insert into t5 values(22.22);	# 报错,整数部位多了
mysql> insert into t5 values(1.22222);	# 不报错,但是只会存1.222,后面的会被截断
Query OK, 0 rows affected (0.04 sec)

# float(10)	和int同样,补充整数位
  • decimal
    • 使用方法decimal(x, y) x是总长度,y是小数点后长度
    • 范围内不会丢失精度,范围外会提醒丢失
    • 总长度最大65,小数长度最大30,超出范围就报错

注意:同样是默认有符号,设置无符号的方式和上面相同

3 字符串

类型 大小 用途
CHAR 0-255字节 定长字符串
VARCHAR 0-65535 字节 变长字符串
TINYBLOB 0-255字节 不超过 255 个字符的二进制字符串
TINYTEXT 0-255字节 短文本字符串
BLOB 0-65 535字节 二进制形式的长文本数据
TEXT 0-65 535字节 长文本数据
MEDIUMBLOB 0-16 777 215字节 二进制形式的中等长度文本数据
MEDIUMTEXT 0-16 777 215字节 中等长度文本数据
LONGBLOB 0-4 294 967 295字节 二进制形式的极大文本数据
LONGTEXT 0-4 294 967 295字节 极大文本数据

char(10)

  • 存储'abc' 占10个字符长度
  • 优点::读取存储速度快于 varchar
  • 缺点:浪费磁盘空间

varchar(10)

  • 存储'abc' 占4个字符(3个长度字符外加一个bit存储字符长度)
  • 优点:节省空间
  • 缺点:速度慢于char类型
# char如果不规定长度,那默认是1
mysql> create table t8(id, char);
mysql> insert into t8 values('123');	# 报错

# char规定长度,即便输入的长度小于最大长度,也就保存为最大长度
# varchar规定长度,保存长度为输入长度+1
# 测不出来

# 在字符串后面加空格,mysql会自动删掉
mysql> insert into t8 values(1      , 2    );
mysql> select * from t8;

如果字符长度不大,建议使用char类型,反之则选择varchar

text

  • 具备编码的大字符串

blob

  • 没有编码的二进制大对象
  • 可以用来储存可变数量的数据,但一般不会存,都是建一个文件服务器,然后用数据库保存文件的地址信息

注意:字符串右端空格自动清除

  • mysql会自动将字符串后面的空格删掉,所以你的数据在存储前应该先把空格处理掉

4 日期和时间

类型 大小 (字节) 范围 格式 用途
date 3 1000-01-01/9999-12-31 YYYY-MM-DD 年月日
time 3 '-838:59:59'/'838:59:59' HH:MM:SS 时分秒
year 1 1901/2155 YYYY 年份值
datetime 8 1000-01-01 00:00:00/9999-12-31 23:59:59 YYYY-MM-DD\HH:MM:SS 年月日时分秒
timeshamp 4 1970-01-01 00:00:00/2038 结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD\HHMMSS 混合日期和时间值,时间戳

year date time 都可以用字符串或数字两种方式输入值

上述所有的类型年份都可以是两位数,0-69翻译为2000-2069 70-99 翻译为1970-1999

# date time year datetime timestamp都可以使用字符串和整形两种方式添加记录,并且年份可以简写
# date
mysql> create table t9(y date);
mysql> insert into t9 values('09-01-01');
mysql> select * from t9;
+------------+
| y          |
+------------+
| 2009-01-01 |
+------------+
1 row in set (0.00 sec)

mysql> insert into t9 values(090101);
mysql> select * from t9;


# datetime
mysql> create table t11(dt datetime);
# 时间也可以不写,月日必须写,年可以不写,默认2000年
mysql> insert into t11 values(0101);	
mysql> insert into t11 values(120202);
mysql> insert into t11 values('13-03-03 10:10:00')
mysql> select * from t11;
+---------------------+
| dt                  |
+---------------------+
| 2000-01-01 00:00:00 |
| 2012-02-02 00:00:00 |
| 2013-03-03 10:10:00 |
+---------------------+
3 rows in set (0.00 sec)

#timestamp
mysql> create table t12(ts timestamp);
mysql> insert into t12 values(121001);
mysql> insert into t12 values('10-05-01 10:10:10');
mysql> insert into t12 values(100101123000);
mysql> select * from t12;
+---------------------+
| ts                  |
+---------------------+
| 2012-10-01 00:00:00 |
| 2010-05-01 10:10:10 |
| 2010-01-01 12:30:00 |
+---------------------+
3 rows in set (0.00 sec)

# 添加当前时间
# 时间相关的函数:now()
mysql> insert into t12 values(now());
# 时间相关的常量:CURRENT_TIME 
mysql> insert into t12 values(current_time);

date/time/datetime 示例

mysql> create table t4 (d date,t time,dt datetime);
mysql> desc t4;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)

# 使用now()获取当前时间
mysql> insert into t4 values (now(),now(),now());
mysql> select * from t4;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
+------------+----------+---------------------+
1 row in set (0.00 sec)

# 添加null
mysql> insert into t4 values (null,null,null);
mysql> select * from t4;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2018-09-21 | 14:51:51 | 2018-09-21 14:51:51 |
| NULL       | NULL     | NULL                |
+------------+----------+---------------------+
2 rows in set (0.00 sec)

timestamp示例

mysql> create table t5 (id1 timestamp);
mysql> desc t5;
+-------+-----------+------+-----+-------------------+-----------------------------+
| Field | Type      | Null | Key | Default           | Extra                       |
+-------+-----------+------+-----+-------------------+-----------------------------+
| id1   | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+-------+-----------+------+-----+-------------------+-----------------------------+
row in set (0.00 sec)

# 插入数据null,会自动插入当前时间的时间
mysql> insert into t5 values (null);
mysql> select * from t5;
+---------------------+
| id1                 |
+---------------------+
| 2019-07-12 00:36:41 |
+---------------------+
1 row in set (0.00 sec)

#添加一列 默认值是'0000-00-00 00:00:00'
mysql> alter table t5 add id2 timestamp;
mysql> show create table t5 \G	# 这里加;会报错
*************************** 1. row ***************************
       Table: t5
Create Table: CREATE TABLE `t5` (
  `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


# 手动修改新的列默认值为当前时间
mysql> alter table t5 modify id2 timestamp default current_timestamp;
mysql> show create table t5 \G
*************************** 1. row ***************************
       Table: t5
Create Table: CREATE TABLE `t5` (
  `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `id2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> insert into t5 values (null,null);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t5;
+---------------------+---------------------+
| id1                 | id2                 |
+---------------------+---------------------+
| 2019-07-12 00:36:41 | 0000-00-00 00:00:00 |
| 2019-07-12 00:41:10 | 2019-07-12 00:41:10 |
+---------------------+---------------------+
2 rows in set (0.00 sec)

5 枚举 集合

枚举是提前规定一个范围 你的值只能是其中之一 多选一

集合是提前规定一个范围 你的值可以是其中的多个 多选多

集合在插入数据时 ,多个值之前用逗号隔开 但他们必须包含在同一个字符串内!

# enum,不能插入不属于设定值的值,也只能插入一个值
mysql> create table t11(gender enum('man', 'woman'));
mysql> insert into t11 values('123');	# 报错
mysql> insert into t11 values('man, woman'); 	# 报错
mysql> insert into t11 values('man');

# set 不能插入不属于设定值的值,可以插入多个值,会去重
mysql> create table t13(hobby set('swim', 'play', 'run', 'read'));
mysql> insert into t13 values ('swim,play,swim');

设置严格/非严格模式

mysql 5.6默认是非严格模式,如果你的数据超出范围,不会报错,会自动取该数据类型的最大值,所以容易丢失数据,可以进行一些修改。

# 查看当前的sql模式
select @@sql_mode;   # @@表示系统内置变量   @表示用户自定义的

+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+

# 临时设置sql_mode,退出登录后又得设置
set @@sql_mode = 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES';
					# 原有的				设置为严格模式

# 想要永久设置,直接修改配置文件即可
[mysqld]
sql_mode = NO_ENGINE_SUBSTITUTION, STRICT_TRANS_TABLES


  • 局部变量:只对当前用户有效
  • 全局变量:所有客户端都有效
posted @ 2019-07-12 00:46  abcde_12345  阅读(557)  评论(0编辑  收藏  举报