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

阅读导航

引言

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

一、char

🎯基本语法

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

🎯使用示例

sql 复制代码
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

🎯基本语法

sql 复制代码
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字节)

🎯使用示例

sql 复制代码
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占用字节
abcd abcd abcd 4*3=12 4*3+1=13
A A A 4*3=12 1*3+1=4
abcde X X 数据超过长度 数据超过长度

📦如何选择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. 使用示例

sql 复制代码
//创建表
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

🎯基本语法

sql 复制代码
enum:枚举,"单选"类型;
enum('选项1','选项2','选项3',...);

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

sql 复制代码
set:集合,"多选"类型;
set('选项值1','选项值2','选项值3', ...);

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

相关推荐
Kapaseker1 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴1 小时前
Android17 为什么重写 MessageQueue
android
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android