第三章:数据类型
在本章中,我们将学习 MySQL 中的常用数据类型,以及如何根据不同的需求选择合适的数据类型。同时,我们也会讲解 NULL 值和默认值的使用方式,以及一些常见的错误示例和面试题。通过本章的学习,你将能够理解数据类型的选择对数据库设计的影响,并学会如何合理使用它们。
1. 常用数据类型
MySQL 提供了多种数据类型,供开发者根据实际情况选择合适的类型。以下是一些常用的 MySQL 数据类型:
1.1 数值类型
-
INT(整数)
用于存储整数。常见的有INT
,TINYINT
,SMALLINT
,MEDIUMINT
,BIGINT
等,代表不同的存储范围。INT
是最常用的类型,适合存储大多数整数。CREATE TABLE example ( id INT, -- 整数 age INT -- 年龄 );
-
DECIMAL(定点数)
用于存储精确的数值,通常用于货币或计算中需要精确到小数点后的场合。可以指定小数点后的位数。CREATE TABLE example ( price DECIMAL(10, 2) -- 价格,最多10位数字,其中2位是小数 );
-
FLOAT / DOUBLE(浮动小数)
用于存储带小数的数值,但其精度可能有限。FLOAT
和DOUBLE
都是用于存储近似数值,适用于科学计算,但不适用于需要精确的小数计算。CREATE TABLE example ( rating FLOAT -- 评分,可能是浮动的小数 );
1.2 字符类型
-
VARCHAR(变长字符)
用于存储变长的字符串。常用于存储名称、地址、邮箱等文本数据。VARCHAR
可以节省存储空间,因为它只占用实际字符数的空间。CREATE TABLE example ( name VARCHAR(100) -- 存储姓名,最多100个字符 );
-
CHAR(定长字符)
用于存储定长的字符串。例如,存储固定长度的代码或者国家的两字母代码等。CHAR
比VARCHAR
占用更多的空间,因为它总是为每个字段分配固定的长度。CREATE TABLE example ( country_code CHAR(2) -- 存储国家代码,如 "US" );
-
TEXT(文本)
用于存储大量文本数据。TEXT
可以存储更大容量的数据,最多支持 65,535 字符。适合存储描述、文章内容等长文本数据。CREATE TABLE example ( description TEXT -- 产品描述 );
1.3 日期和时间类型
-
DATE(日期)
用于存储日期,格式为YYYY-MM-DD
。CREATE TABLE example ( birthdate DATE -- 存储出生日期 );
-
DATETIME(日期和时间)
用于存储日期和时间,格式为YYYY-MM-DD HH:MM:SS
。CREATE TABLE example ( created_at DATETIME -- 存储记录创建时间 );
-
TIMESTAMP(时间戳)
用于存储从 ‘1970-01-01 00:00:00’ 到当前时间的秒数,通常用于记录事件的发生时间。CREATE TABLE example ( updated_at TIMESTAMP -- 存储更新时间 );
2. 数据类型的选择与应用
选择合适的数据类型对于数据库的性能和数据准确性至关重要。我们在选择数据类型时,通常需要考虑以下几个因素:
- 存储需求:使用合适大小的类型可以节省存储空间。比如,如果知道某个数值不会超过 100,选择
TINYINT
而不是INT
可以节省空间。 - 性能:较小的数据类型(如
INT
和VARCHAR(50)
)在查询时会比较大的数据类型(如BIGINT
和TEXT
)更高效。 - 准确性:对于需要高精度的数字(如货币),应该使用
DECIMAL
类型而不是FLOAT
或DOUBLE
。 - 业务需求:根据实际需求选择合适的数据类型,比如
TEXT
用于存储长文本,DATE
用于存储日期等。
2.1 选择合适的数据类型
- 数字:如果数值范围较小,优先选择
TINYINT
或SMALLINT
,以节省存储空间。 - 文本:对于大文本数据,使用
TEXT
,对于中等大小的文本数据,使用VARCHAR
。 - 日期:如果只需要存储日期,不需要时间,使用
DATE
;如果需要存储日期和时间,使用DATETIME
。
3. NULL 值与默认值的使用
3.1 NULL 值
-
NULL 值表示数据缺失或不可用。在 MySQL 中,NULL 并不等同于空字符串 (
''
) 或零(0
),它是一个特殊的值,表示“没有值”。 -
在创建表时,可以通过
NULL
或NOT NULL
来指定某个字段是否可以为空。CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, -- 姓名不能为空 age INT NULL -- 年龄可以为空 );
3.2 默认值
-
默认值用于当插入数据时,如果未指定某个字段的值,MySQL 会自动为该字段填入一个默认值。
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 默认值为当前时间 );
4. 常见错误示例与解释
4.1 插入数据时字段类型不匹配
INSERT INTO users (age) VALUES ('twenty-five');
错误原因:age
字段是 INT
类型,而插入的是字符串 'twenty-five'
,应该插入一个数字。
4.2 插入 NULL 值时违反了 NOT NULL
约束
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
INSERT INTO users (name) VALUES (NULL);
错误原因:name
字段设置了 NOT NULL
约束,而插入的值为 NULL。正确的做法是为 name
提供一个非 NULL 的值。
4.3 存储浮动小数时精度丢失
CREATE TABLE products (
price DECIMAL(5, 2)
);
INSERT INTO products (price) VALUES (123.456);
错误原因:DECIMAL(5, 2)
表示最多 5 位数字,其中 2 位为小数,因此 123.456
将被截断为 123.45
。
5. 常见面试题及解答
-
什么是
AUTO_INCREMENT
?AUTO_INCREMENT
是一个自动增长的字段类型,通常用于主键字段。每次插入新记录时,MySQL 会自动为该字段生成一个唯一的值。
-
为什么使用
DECIMAL
而不是FLOAT
或DOUBLE
来存储货币数据?- 因为
DECIMAL
存储的数值是精确的,不会出现浮动误差,而FLOAT
和DOUBLE
存储的数值是近似的,适合科学计算,但不适合存储需要精确计算的小数。
- 因为
-
VARCHAR
和CHAR
的区别是什么?VARCHAR
是变长字符串,存储空间是实际使用的字符数;而CHAR
是定长字符串,存储固定长度的字符,如果字符串长度不足,会用空格填充。
-
MySQL 中的
NULL
与空字符串 (''
) 有什么区别?NULL
表示数据缺失或不可用,而空字符串表示存在一个长度为零的字符串。它们在逻辑上是不同的,不能互换使用。
小结
通过本章的学习,你了解了 MySQL 中常用的数据类型,包括数值类型、字符类型、日期和时间类型等。你还学会了如何选择合适的数据类型