当前位置: 首页 > article >正文

MySQL(5)【数据类型 —— 字符串类型】

阅读导航

  • 引言
  • 一、char
    • 🎯基本语法
    • 🎯使用示例
  • 二、varchar
    • 🎯基本语法
    • 🎯使用示例
  • 三、char 和 varchar 比较
  • 四、日期和时间类型
    • 1. 基本概念
    • 2. 使用示例
  • 五、enum 和 set
    • 🎯基本语法

引言

之前我们聊过MySQL中的数值类型,它们帮助我们在数据库中存储和处理数字信息。但你知道吗?除了数字,文本也是数据库中非常关键的部分。比如,用户的名字、地址、甚至是网站的内容,都是以文本形式存在的。接下来,我们将一起探索MySQL中的字符串类型。

一、char

🎯基本语法

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

🎯使用示例

mysql> create table t9(id int, name char(2));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t9 values(100, 'ab');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t9 values(101, '中国');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t9;
+------+--------+
| id | name |
+------+--------+
| 100 | ab |
| 101 | 中国 |
+------+--------+

📌注意:char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255
在这里插入图片描述

二、varchar

🎯基本语法

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

varchar(len)类型允许你指定一个长度len,这个长度表示的是字符的最大数量,而不是字节。

🚨注意实际能存储的字节数取决于你使用的字符编码(如UTF-8、GBK等)和MySQL为记录字符串长度所需的额外字节

  • 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844(因为utf中,一个字符占用3个字节),
  • 如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)

🎯使用示例

mysql> create table tt10(id int ,name varchar(6)); --表示这里可以存放6个字符

mysql> insert into tt10 values(100, 'hello');

mysql> insert into tt10 values(100, '我爱你,中国');

mysql> select * from tt10;
+------+--------------------+
| id | name |
+------+--------------------+
| 100 | hello |
| 100 | 我爱你,中国 |
+------+--------------------+

三、char 和 varchar 比较

实际存储char(4)varchar(4)char占用字节varchar占用字节
abcdabcdabcd4*3=124*3+1=13
AAA4*3=121*3+1=4
abcdeXX数据超过长度数据超过长度

📦如何选择charvarchar

  • 定长类型(char)如果字段中的数据长度是固定的,比如身份证号码(总是18位)、手机号码(通常是11位)或MD5哈希值(固定为32位十六进制字符),那么使用定长类型(char)是更合适的选择。char类型会在磁盘上直接为每条记录分配固定长度的空间,无论实际存储的数据长度如何。这种方式虽然可能会导致一些空间浪费(尤其是当字段值短于分配的长度时),但它提供了更高的数据检索效率,因为数据库系统可以直接定位到数据的起始位置,无需计算数据的实际长度

  • 变长类型(varchar):对于长度可能变化的数据,如名字、地址等,使用变长类型(varchar)更为合适。varchar类型会根据实际存储的数据长度动态分配空间,但会额外使用一个或两个字节来记录数据的实际长度(取决于最大长度设置)。这种方式可以节省存储空间,尤其是在数据长度差异较大的情况下。然而,由于需要额外的字节来记录长度,并且在读取时需要先读取长度信息,因此可能会稍微降低数据检索的效率

四、日期和时间类型

1. 基本概念

常用的日期类型有如下三个:

  1. date:用于表示日期,格式为’yyyy-mm-dd’,其存储范围从’1000-01-01’到’9999-12-31’。尽管您提到它占用三字节,但实际上在MySQL中,date类型通常占用4字节来存储。

  2. datetime:用于表示日期和时间,格式为’yyyy-mm-dd HH:ii:ss’,其存储范围同样从’1000-01-01 00:00:00’到’9999-12-31 23:59:59’。datetime类型占用8字节来存储,这包括了日期和时间的完整信息。

  3. timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节。

2. 使用示例

//创建表
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.01 sec)

//插入数据
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1'); --插入两种时间
Query OK, 1 row affected (0.00 sec)

mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 1997-07-01 | 2008-08-08 12:01:01 | 2024-8-20 19:22:35 | --添加数据时,时间戳自动补上当前时间
+------------+---------------------+---------------------+

//更新数据
mysql> update birthday set t1='2000-1-1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 2000-01-01 | 2008-08-08 12:01:01 | 2024-8-20 19:26:08 | -- 更新数据,时间戳会更新成当前时间
+------------+---------------------+---------------------+

五、enum 和 set

🎯基本语法

enum:枚举,“单选”类型;
enum('选项1','选项2','选项3',...);

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,…最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

set:集合,“多选”类型;
set('选项值1','选项值2','选项值3', ...);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,… 最多64个。


http://www.kler.cn/a/401389.html

相关文章:

  • Linux的目录结构
  • 【代码随想录|回溯算法排列问题】
  • 每日OJ题_牛客_天使果冻_递推_C++_Java
  • ggplot2-scale_x_continuous()
  • 【Qt】QTreeWidget的简单使用
  • 算法--“汽车加油”问题.
  • HAL库中MSP回调--HAL_PPP_MspInit()与中断回调--HAL_PPP_Callback()的区别及一些学习见解
  • Java基础夯实——2.4 线程的生命周期
  • FastDDS之DataSharing
  • Odoo中,要实现实时数据推送,SSE 与 WebSocket 该如何选择
  • 利用python 检测当前目录下的所有PDF 并转化为png 格式
  • 无人机侦察打击方案(1)
  • React渲染和更新机制及其核心内容详解
  • ChatGPT-o1快速完成论文选题的9类提示词
  • ggplot2-scale_x_continuous()
  • 【面试】前端vue项目架构详细描述
  • 一文详解架构分层
  • Photoshop(PS)——人像磨皮
  • 并发专题(1)之深入理解并发、线程与等待通知机制
  • 24. 两两交换链表中的节点
  • 行列式的理解与计算:线性代数中的核心概念
  • 浅谈python
  • AI新闻周刊 | 最新AI资讯速递(11.11-11.17)
  • SMARTFORMS函数调用完整示例:打印工厂物料信息
  • 建造者模式(Builder Pattern)
  • 数字后端零基础入门系列 | Innovus零基础LAB学习Day11(Function ECO流程)