从0-1学习Mysql第三章: 数据类型

news/2025/2/25 17:56:31

第三章:数据类型

在本章中,我们将学习 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(浮动小数)
    用于存储带小数的数值,但其精度可能有限。FLOATDOUBLE 都是用于存储近似数值,适用于科学计算,但不适用于需要精确的小数计算。

    CREATE TABLE example (
      rating FLOAT  -- 评分,可能是浮动的小数
    );
    
1.2 字符类型
  • VARCHAR(变长字符)
    用于存储变长的字符串。常用于存储名称、地址、邮箱等文本数据。VARCHAR 可以节省存储空间,因为它只占用实际字符数的空间。

    CREATE TABLE example (
      name VARCHAR(100)  -- 存储姓名,最多100个字符
    );
    
  • CHAR(定长字符)
    用于存储定长的字符串。例如,存储固定长度的代码或者国家的两字母代码等。CHARVARCHAR 占用更多的空间,因为它总是为每个字段分配固定的长度。

    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 可以节省空间。
  • 性能:较小的数据类型(如 INTVARCHAR(50))在查询时会比较大的数据类型(如 BIGINTTEXT)更高效。
  • 准确性:对于需要高精度的数字(如货币),应该使用 DECIMAL 类型而不是 FLOATDOUBLE
  • 业务需求:根据实际需求选择合适的数据类型,比如 TEXT 用于存储长文本,DATE 用于存储日期等。
2.1 选择合适的数据类型
  • 数字:如果数值范围较小,优先选择 TINYINTSMALLINT,以节省存储空间。
  • 文本:对于大文本数据,使用 TEXT,对于中等大小的文本数据,使用 VARCHAR
  • 日期:如果只需要存储日期,不需要时间,使用 DATE;如果需要存储日期和时间,使用 DATETIME

3. NULL 值与默认值的使用

3.1 NULL 值
  • NULL 值表示数据缺失或不可用。在 MySQL 中,NULL 并不等同于空字符串 ('') 或零(0),它是一个特殊的值,表示“没有值”。

  • 在创建表时,可以通过 NULLNOT 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. 常见面试题及解答

  1. 什么是 AUTO_INCREMENT

    • AUTO_INCREMENT 是一个自动增长的字段类型,通常用于主键字段。每次插入新记录时,MySQL 会自动为该字段生成一个唯一的值。
  2. 为什么使用 DECIMAL 而不是 FLOATDOUBLE 来存储货币数据?

    • 因为 DECIMAL 存储的数值是精确的,不会出现浮动误差,而 FLOATDOUBLE 存储的数值是近似的,适合科学计算,但不适合存储需要精确计算的小数。
  3. VARCHARCHAR 的区别是什么?

    • VARCHAR 是变长字符串,存储空间是实际使用的字符数;而 CHAR 是定长字符串,存储固定长度的字符,如果字符串长度不足,会用空格填充。
  4. MySQL 中的 NULL 与空字符串 ('') 有什么区别?

    • NULL 表示数据缺失或不可用,而空字符串表示存在一个长度为零的字符串。它们在逻辑上是不同的,不能互换使用。

小结

通过本章的学习,你了解了 MySQL 中常用的数据类型,包括数值类型、字符类型、日期和时间类型等。你还学会了如何选择合适的数据类型


http://www.niftyadmin.cn/n/5865797.html

相关文章

设计模式-(单例,简单工厂,工厂,抽象工厂)

单例模式 概念: 确保一个类只有一个实例,而且自行实例化并向震哥哥系统提供这个实例 应用: 无状态的,一般以工具类形式,进行提供 代码: 懒汉式,双重检查锁 class Singleton {private sta…

FutureTask 和 CompletableFuture

FutureTask 和 CompletableFuture 是 Java 并发编程中用于处理异步任务的两种工具,但它们在功能和使用场景上有显著区别。以下是两者的主要对比: 1. FutureTask 定义:FutureTask 是 Future 接口的一个实现类,表示一个异步计算任务…

java23种设计模式-建造者模式

建造者模式(Builder Pattern)学习笔记 1. 模式定义 建造者模式是一种创建型设计模式,通过分步构建复杂对象的方式,将对象的构建过程与表示分离。允许使用相同的构建过程创建不同的对象表示。 2. 适用场景 ✅ 需要创建包含多个…

2025年信息科学与工程学院科协机器学习介绍——机器学习基本模型介绍

机器学习 目录 机器学习一.安装基本环境conda/miniconda环境 二.数据操作数据预处理一维数组二维数组以及多维数组的认识访问元素的方法torch中tenson的应用张量的运算张量的广播 三.线性代数相关知识四.线性回归SoftMax回归问题(分类问题)什么是分类问题…

利用python和gpt写一个conda环境可视化管理工具

最近在学习python,由于不同的版本之间的差距较大,如果是用环境变量来配置python的话,会需要来回改,于是请教得知可以用conda来管理,但是conda在管理的时候老是要输入命令,感觉也很烦,于是让gpt帮…

C++ 继承与运算符重载的简单练习

1.长方形的继承类 #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #include <sstream> #include <vector> #include <memory>using namespace std; class AB{ private:int a;int …

【odoo18-文件管理】在uniapp上访问odoo系统上的图片

在uniapp上访问odoo系统上的图片 1、以url的形式访问 a&#xff1a;以odoo本身的域名&#xff0c;比如http://127.0.0.1:8069/web/image/product.template/3/image_128?unique1740380422000&#xff0c;这种方式需要解决跨域的问题。 b&#xff1a;以文件服务器的形式&…

短剧小程序系统源码

短剧小程序系统源码 今天我要向大家介绍的是最新作品——短剧小程序系统源码。这不仅仅是一款简单的播放工具&#xff0c;它背后蕴含的强大功能能够帮助你的短剧业务实现质的飞跃&#xff01; 为什么说这款源码很厉害&#xff1f; 首先&#xff0c;在当今竞争激烈的市场环境…