加载中...

MySQL(二)--数据类型


MySQL数据类型

MySQL存储引擎类型

# 存储引擎
    # MyISAM: 适合做读 插入数据比较频繁的,对修改和删除涉及少的,
            # 不支持事务,行级锁和外键,有表级锁
            # 索引和数据分开存储,mysql5.5以下默认的存储引擎
            # 存储文件的个数:表结构、表中的数据、索引

    # InnoDB:适合并发比较高的,对事物一致性要求高的,
            # 相对更适应频繁的修改和删除操作,有行级锁,外键且支持事务
            # 索引和数据是存在一起的,【mysql5.6以上默认的存储引擎】
            # 存储文件的个数:表结构、表中的数据
            
    # MEMORY:数据存在内存中,表结构存在硬盘上,
            # 优势:增删改查速度快,
            # 劣势:重启数据消失、容量有限

    # 查看数据库所支持的存储引擎:
            show engines;

    # 查看当前库配置信息
            show variables like '%engine%';
            show variables like '%chara%';

数值类型

MySQL支持所有标准SQL数值数据类型。

这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

MySQL支持的整数类型有TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

对于小数的表示,MYSQL分为两种方式:浮点数和定点数。浮点数包括float(单精度)和double(双精度),而定点数只有decimal一种,在mysql中以字符串的形式存放,比浮点数更精确,适合用来表示货币等精度高的数据。

BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

类型 大小 范围(有符号) 范围(无符号)unsigned约束 用途
TINYINT 1 字节 (-128,127) (0,255) 小整数值
SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值
MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值
INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值
BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值
FLOAT 4 字节float(255,30) (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 单精度 浮点数值
DOUBLE 8 字节double(255,30) (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 双精度 浮点数值
DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2,否则为D+2double(65,30) 依赖于M和D的值 依赖于M和D的值 小数值
-- int 在 表 中的创建方法
create table 表名 values(
    字段1 int,
    字段2 int(显示宽度),
    字段3 int unsigned,
    字段4 int(显示宽度) unsigned
);

-- int默认是有符号的
-- unsigned它能表示的数字的范围不被宽度约束
-- unsigned它只能约束数字的显示宽度

int 示例

# 创建一个 t1 表,使字段it2长度为5
mysql> create table t1(id1 int,it2 int(5));
Query OK, 0 rows affected (0.33 sec)

# 向 t1 表中插入一条数据
mysql> insert into t1 values(1,2);
Query OK, 1 row affected (0.13 sec)

# 显示 t1 表中所有数据,发现数据显示正常
mysql> select * from t1;
+------+------+
| id1  | it2  |
+------+------+
|    1 |    2 |
+------+------+
1 row in set (0.00 sec)

# 再插入一条长的数据,看看能否显示完全
mysql> insert into t1 values(111111,222222);
Query OK, 1 row affected (0.22 sec)

# 查看结果发现并不是只显示5位
mysql> select * from t1;
+--------+--------+
| id1    | it2    |
+--------+--------+
|      1 |      2 |
| 111111 | 222222 |
+--------+--------+
2 rows in set (0.00 sec)

int的unsigned作用

# 创建 t2 表并使 id1字段无符号,表示数字的范围不被宽度约束
mysql> create table t2(id1 int(4) unsigned,id2 int(5));
Query OK, 0 rows affected (0.73 sec)

# id1可以正常插入
mysql> insert into t2 values(2147483648,2147483647);
Query OK, 1 row affected (0.13 sec)

# id2超出int数字范围发出警告,默认取最大范围值
mysql> insert into t2 values(2147483647,2147483648);
Query OK, 1 row affected, 1 warning (0.13 sec)

mysql> select * from t2;
+------------+------------+
| id1        | id2        |
+------------+------------+
| 2147483648 | 2147483647 |
| 2147483647 | 2147483647 |
+------------+------------+
2 rows in set (0.00 sec)
-- 小数的使用

-- 创建带有 小数 的表
create table 表名(
    字段1 float,  -- 默认单精度,小数位很少
    字段2 double,  -- 默认双精度,写什么显示什么
    字段3 decimal,  -- 默认只显示整数
);

-- 创建带有 指定小数 的表,当设置指定小数位数时,会根据指定位数的后一位小数做四舍五入然后显示
create table 表名(
    字段1 float(一共显示的位数,小数部分占几位), 
    字段2 double(一共显示的位数,小数部分占几位),
    字段3 decimal(一共显示的位数,小数部分占几位),
);

小数示例

# 创建表的三个字段分别为float,double和decimal参数表示一共显示5位,小数部分占2位
mysql> create table t2 (id1 float(5,2),id2 double(5,2),id3 decimal(5,2));
Query OK, 0 rows affected (0.02 sec)

# 向表中插入1.23,结果正常
mysql> insert into t2 values (1.23,1.23,1.23);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t2;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
+------+------+------+
row in set (0.00 sec)

# 向表中插入1.234,会发现4都被截断了
mysql> insert into t2 values (1.234,1.234,1.234);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from t2;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
| 1.23 | 1.23 | 1.23 |
+------+------+------+
rows in set (0.00 sec)

# 向表中插入1.235发现数据虽然被截断,但是遵循了四舍五入的规则
mysql> insert into t2 values (1.235,1.235,1.235);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from t2;
+------+------+------+
| id1  | id2  | id3  |
+------+------+------+
| 1.23 | 1.23 | 1.23 |
| 1.23 | 1.23 | 1.23 |
| 1.24 | 1.24 | 1.24 |
+------+------+------+
rows in set (0.00 sec)

# 建新表去掉参数约束
mysql> create table t3 (id1 float,id2 double,id3 decimal);
Query OK, 0 rows affected (0.02 sec)

# 分别插入1.234
mysql> insert into t3 values (1.234,1.234,1.234);
Query OK, 1 row affected, 1 warning (0.00 sec)

# 发现decimal默认值是(10,0)的整数
mysql> select * from t3;
+-------+-------+------+
| id1   | id2   | id3  |
+-------+-------+------+
| 1.234 | 1.234 |    1 |
+-------+-------+------+
row in set (0.00 sec)

# 当对小数位没有约束的时候,输入超长的小数,会发现float和double的区别
mysql> insert into t3 values (1.2355555555555555555,1.2355555555555555555,1.2355555555555555555555);
Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> select * from t3;
+---------+--------------------+------+
| id1     | id2                | id3  |
+---------+--------------------+------+
|   1.234 |              1.234 |    1 |
| 1.23556 | 1.2355555555555555 |    1 |
+---------+--------------------+------+
rows in set (0.00 sec)

日期和时间类型

表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。

每个时间类型有一个有效值范围和一个”零”值,当指定不合法的MySQL不能表示的值时使用”零”值。

TIMESTAMP类型有专有的自动更新特性,将在后面描述。

类型 大小 (字节) 范围 格式 用途
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 年月日时分秒
TIMESTAMP 4 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 YYYYMMDD HHMMSS 混合日期和时间值,时间戳
-- 时间类型
-- 创建 时间相关 的表
create table 表名(
    字段1 year,  -- 显示年
    字段2 time,  -- 显示时分秒
    字段3 date,  -- 显示年月日
    字段4 datetime,  -- 显示年月日时分秒
    字段5 timestamp  -- 显示年月日时分秒,默认不能为空,如果为空会自取当前时间
);

-- 增加数据,数字方式,位数必须够;now()取当前时间
insert into 表名 values(2019,221010,20191128,20191128221000,now());

-- 增加数据,字符串格式化方式,格式化字符为系统能识别的即可('-','+'等)
insert into 表名 values(2019,'22:10:10','2019-11-28','2019-11-28 22:10:00',now());

字符串类型

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

类型 大小 用途
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 和 VARCHAR 类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

CHAR列的长度固定为创建表是声明的长度,范围(0-255);而VARCHAR的值是可变长字符串范围(0-65535)。

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

BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。

有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。

ENUM和SET类型

ENUM中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显示。ENUM只允许从值集合中选取单个值,而不能一次取多个值

SET和ENUM非常相似,也是一个字符串对象,里面可以包含0-64个成员。根据成员的不同,存储上也有所不同。set类型可以允许值集合中任意选择1或多个元素进行组合。对超出范围的内容将不允许注入,而对重复的值将进行自动去重。

类型 大小 用途
ENUM 对1-255个成员的枚举需要1个字节存储;对于255-65535个成员,需要2个字节存储;最多允许65535个成员。 单选:选择性别
SET 1-8个成员的集合,占1个字节9-16个成员的集合,占2个字节17-24个成员的集合,占3个字节25-32个成员的集合,占4个字节33-64个成员的集合,占8个字节 多选:兴趣爱好
-- 创建表
create table 表名(
    gender enum('男','女'),
    hobby set('吉他','计算机','手机')
)charset='utf8';  -- 使用utf8字符集识别中文

-- 插入数据
mysql> insert into 表名 values('男','吉他,手机,跑步');  -- 如果hobby中没有指定值则不显示

-- 查看表
mysql> select * from t4;
+--------+---------------+
| gander | hobby         |
+--------+---------------+
|| 吉他,手机     |
+--------+---------------+
1 row in set (0.00 sec)

文章作者: 无夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无夜 !
评论
  目录