三:MySQL中的数据类型 - 系统的撸一遍MySQL

MySQL中但数据类型主要分为 数值类型、字符串类型、日期时间类型,随着MySQL版本升级,往往会对一些数据类型进行优化。

数值类型

整型

数据类型字节有符号无符号
TINYINT1

-128 ~ 127

0 ~ 255

SMALLINT2-32768 ~ 327670 ~ 65535
MEDIUMINT3-8388608 ~ 83886070 ~ 16777215
INT4-2147483648 ~ 21474836470 ~ 4294967295
BITINT8-9233372036854775808 ~ 92233720368547758070 ~ 8446744073709551615
数值宽度

整型的数据类型可以指定数值的宽度比如:

//默认的INT型 字宽为11
INT(11)
//指定宽度为4的时候 如果配合ZEROFILL使用 如果不足4位将会在前面补0
INT(4)
有符号和无符号

默认情况下如果没有指定是否有符号则默认为有符号(SIGNED),如果指定ZEROFILL会自动设置为无符号(UNSIGNED)。

AUTO_INCREMENT

整型可以设置 AUTO_INCREMENT 属性保持该字段可以自动增长,该字段应该设置为主键约束或增加唯一索引并且将其设置为NOT NULL。

浮点型

数据类型字节
float4
double8
精度

浮点数可以指定 整数位和小数位,例如:

//如果没有设置精度 则按真实数值进行存储,如果指定精度则根据精度四舍五入
create table test(
`float_def` float,
`float_var` float(6, 2),
`double_var` double(6, 2)
)

定点数

数据类型字节
DECIMAL(M,D)M+2
精度

定点数也可以指定精度,例如:

//如果没有指定精度,默认定义为:DECIMAL(10,0)
//如果插入数值精度高于定义精度,则四舍五入同时出发一个Warning
create table decTable (
dec_def decimal,
dec_var decimal(5, 2)
)
//比如如下方法插入,插入结果 dec_var = 4.57
insert into decTable values(10, 4.567);

BIT型

数据类型字节
BIT(M)1 - 8

bit型以二进制位进行存储 BIT(1)表示1位,最大支持64位也就是8个字节长度。

查看BIT类型的字段可以使用 HEX函数 以十六进制的方式查看,或者BIN函数以二进制方式查看。

日期时间类型

数据类型字节最小值最大值
DATE41000-01-019999-12-31
DATETIME81000-01-01 00:00:009999-12-31 23:59:59
TIME3-838:59:59838:59:59
YEAR119012155
TIMESTAMP4197001010800012038年

DATETIME 类型 为 DATE 和 TIME 类型的结合。

任何YYYYMMDDHHMMSS类型的数据只要数值符合合法日期,都可以进行插入无论用什么符号分隔。

TIMESTAMP 与 DATETIME 区别

TIMESTAMP 可以增加 CURRENT_TIMESTAMP 为默认值,当插入为NULL的时候自动设置为系统当前时间。

TIMESTAMP与时区相关,会根据MySQL设置的时区进行日期的转换。

TIMESTAMP 与 DATETIME 的取值范围也不同 TIMESTAMP 支持但范围较小。

字符串类型

数据类型描述
CHAR(M)M 为 0 - 255
VARCHAR(M)M 为 0 - 65535,UTF8编码 为 0 - 65535/3
TINYBLOB0 - 255
MEDIUMBLOB0- 65535
BLOB0 - 167772150
LONGBLOB0 - 4294967295
TINYTEXT0 - 255
TEXT0 - 65535
MEDIUMTEXT0 - 167772150
LONGTEXT0 - 4294967295
VARBINARY(M)0 - M
BINARY(M)0 - M

CHAR 与 VARCHAR 区别

首先如下例子:

//表示 长度为4,如果插入小于4个字符的将在结尾进行空格补齐,并在查询时去掉结尾空格
CHAR(4)
//表示 最大长度为4,如果插入小于4个字符,则长度为插入的字符书,查询时不会去掉结尾空格
VARCHAR(4)

其次,VARCHAR会根据字段的编码类型决定其长度范围。

不同存储引擎下CHAR于VARCHAR是用方式的不同

 MyISAMInnoDBMemory
CHAR全部CHAR为静态表,效率高浪费空间 
VARCHAR包含VARCHAR为动态表,有碎片节省空间,最小化IOVARCHAR作为CHAR处理

TEXT于BLOB

用于存储大文本,TEXT保存字符串,BLOB保存二进制数据,频繁删改会导致空洞纪录影响性能。

BINARY类型

BINARY 与 VARBINARY的区别 与CHAR 与 VARCHAR的区别相同。

但是BINARY类型当插入长度小于定义长度会在结尾补齐0x00,这是与CHAR类型的一个区别

其他类型

ENUM类型

枚举类型需要在定义的时候指定取值范围,并且插入的内容必须在定义的范围之内,否则会默认为枚举范围的第一个。

枚举类型 占用 空间为 1 - 2个字节,分别对应 0 - 255 和 0 - 65535个枚举值的范围。

SET类型

SET类型与枚举类型类似,都需要在定义字段的时候指定取值范围,区别是SET类型可以在插入的时候同时插入多个取值范围内的值。

SET类型 占用空间为 1 - 8个字节,分别对应 0 - 64 位,其中每一个二进制位表示一个成员值,也就是说最多可以支持64个成员值。

转载于:https://my.oschina.net/fuckphp/blog/733739

### 如何在MySQL教务系统中生成和使用测试数据 #### 创建测试数据库环境 为了确保不影响生产数据,在进行任何操作前应先创建一个新的测试数据库。这可以通过SQL命令完成: ```sql CREATE DATABASE IF NOT EXISTS test_education_system; USE test_education_system; ``` 此过程定义了一个名为`test_education_system`的新数据库用于后续的操作[^2]。 #### 设计并初始化表结构 根据需求分析,需要构建多个表格来存储不同类型的信息,比如学生、教师、课程等。这里给出几个基本表的例子及其字段说明: - 学生表(`students`) - `id`: INT, 主键自增 - `name`: VARCHAR(50), 姓名 - `gender`: ENUM('M','F'), 性别 - `age`: TINYINT UNSIGNED, 年龄 - 教师表(`teachers`) - `tid`: INT, 主键自增 - `tname`: VARCHAR(50), 名字 - `department`: VARCHAR(100), 所属院系 对于这些表的创建语句如下所示: ```sql -- 创建学生表 CREATE TABLE students ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), gender ENUM('M', 'F'), age TINYINT UNSIGNED ); -- 创建教师表 CREATE TABLE teachers ( tid INT AUTO_INCREMENT PRIMARY KEY, tname VARCHAR(50), department VARCHAR(100) ); ``` 上述代码片段展示了如何设置两个核心实体的关系型模式。 #### 插入初始测试记录 有了合适的表之后,就可以向其中填充一些虚拟的数据以便于调试程序逻辑或是展示功能特性了。下面是一些简单的INSERT语句用来添加几条样例记录到之前提到的学生表里: ```sql INSERT INTO students (name, gender, age) VALUES ('张', 'M', 20); INSERT INTO students (name, gender, age) VALUES ('李四', 'F', 22); INSERT INTO students (name, gender, age) VALUES ('王五', 'M', 21); ``` 同样的方法也可以应用于其他类型的对象上,如教师、课程等等[^4]。 #### 自动生成大量随机化测试案例 当手动输入变得繁琐时,可以考虑编写脚本来批量制造更多元化的样本集。Python是一种非常适合做这种事情的语言之一,因为它拥有强大的字符串处理能力和丰富的第方库支持。例如,利用pandas和faker这两个包就能轻松达成目的: ```python import pandas as pd from faker import Faker fake = Faker(locale='zh_CN') data = { '姓名': [fake.name() for _ in range(10)], '性别': ['男' if fake.random_int(min=0,max=1)==1 else '女' for i in range(10)], '年龄': [str(fake.random_int(min=18,max=30)) for j in range(10)] } df = pd.DataFrame(data) print(df.to_string(index=False)) ``` 这段Python代码会打印出含有十个虚构人物信息的小表格,可以根据实际应用场景调整参数以适应不同的业务规则。 #### 导入CSV文件作为外部源 如果已经有了现成的数据集合(通常是以Excel或CSV的形式存在),那么可以直接将其导入至目标表内而无需重新录入一遍。假设有一个叫做student_info.csv的文档位于本地磁盘路径下,则可通过LOAD DATA INFILE指令快速加载进去: ```sql LOAD DATA LOCAL INFILE '/path/to/student_info.csv' INTO TABLE students FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; -- 跳过首行标题栏 ``` 这种方法特别适合那些已经积累了历史资料的情况,既节省时间又能保持一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值