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: 0mysql> 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.mzph.cn/news/886716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【蓝桥杯C/C++】翻转游戏:多种实现与解法解析

文章目录 💯题目💯问题分析解法一:减法法解法二:位运算解法解法三:逻辑非解法解法四:条件运算符解法解法五:数组映射法不同解法的比较 💯小结 💯题目 在蓝桥镇&#xff0…

深度学习之人脸检测

在目标检测领域可以划分为了人脸检测与通用目标检测,往往人脸这方面会有专门的算法(包括人脸检测、人脸识别、人脸其他属性的识别等等),并且和通用目标检测(识别)会有一定的差别,着主要来源于人…

docker busybox作为initContainers

一、上传到私有仓储 docker pull busybox:1.33.1 docker tag busybox:1.33.1 192.168.31.185/public/busybox:1.33.1 docker push 192.168.31.185/public/busybox:1.33.1 --- apiVersion: apps/v1 kind: Deploymentspec:containers:- env:- name: ASPNETCORE_ENVIRONMENTvalue…

Java实现两数交换

文章目录 实现两数交换方法一、(数组的方式进行交换)方法二、(对象的方式进行交换)总结 实现两数交换 实现两数交换,没有办法通过直接传递数字达到交换的结果,定义的int型变量是被存储在栈空间上的&#xf…

人工智能在金融领域的应用与风险防范研究

人工智能在金融领域的应用与风险防范研究 摘要:随着人工智能技术的不断进步,其在金融领域的应用日益广泛,同时也带来了新的风险与挑战。本文首先分析了人工智能在金融领域的主要应用场景,如智能投顾、信贷风险评估和反欺诈等。接着…

数据结构(二)线性表

线性表,也称为线性结构,是数据结构中的一种基本类型,其特点是数据元素之间存在一对一的线性关系。线性表通常可以用数组(顺序存储)或链表(链式存储)来实现。线性表的特点是数据元素的排列呈现线…

SQLite3 JDBC Java工具类

最近生产环境mysql各种无法使用,要求下线。有一堆小工具,平时因为mysql用着方便,配置啊,临时的一些比对数据存在里面。迁移很麻烦。 发现SQLite 3.47.0版本之后,性能大增,支持多线程,记录级锁。…

招聘和面试

本篇内容是根据2019年4月份#82 Hiring and job interviews音频录制内容的整理与翻译 小组成员 Mat Ryer、Ashley McNamara、Johnny Boursiquot 和 Carmen Andoh 讨论了受聘、雇用和工作面试的过程。如果人是团队中最重要的部分,我们如何选择与谁一起工作&#xff1…

【代码随想录|回溯算法排列问题】

491.非减子序列 题目链接. - 力扣(LeetCode) 这里和子集问题||很像,但是这里要的是非递减的子序列,要按照给的数组的顺序来进行排序,就是如果我给定的数组是[4,4,3,2,1],如果用子集||的做法先进行排序得到…

GOLANG+VUE后台管理系统

1.截图 2.后端工程截图 3.前端工程截图

Axure PR 9 穿梭框 设计交互

​大家好,我是大明同学。 这期内容,我们将深入探讨Axure中穿梭筛选宽元件设计与交互技巧。 穿梭筛选框元件 创建穿梭筛选框所需的元件 左穿梭筛选框 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.现在画布上创建一个背景,在元件库中…

【东莞石碣】戴尔R740服务器维修raid硬盘问题

1:石碣某塑料工厂下午报修一台戴尔R740服务器硬盘故障,催的还比较着急。 2:工程师经过跟用户确认故障的问题以及故障服务器型号和故障硬盘型号,产品和配件确认好后,公司仓库确认有该款硬盘现货,DELL 12T S…

summernote富文本批量上传音频,视频等附件

普通项目,HTML的summernote富文本批量上传音频,视频等附件(其他附件同理) JS和CSS的引入 <head><th:block th:include"include :: summernote-css" /> </head> <body><th:block th:include"include :: summernote-js" /> …

介绍一下strncpy(c基础)

strncpy是strcpy的进阶版&#xff0c;都是把一个字符串赋值给另一个字符串。但不同的是strncpy可以选择复制几个字符&#xff08;可以完全替代strcpy&#xff09; 链接介绍一下strcpy函数&#xff08;c基础&#xff09;-CSDN博客 格式 #include<string.h> strncpy(ar…

1065 A+B and C (64bit) (20)

Given three integers A, B and C in (−2^63,2^63), you are supposed to tell whether AB>C. Input Specification: The first line of the input gives the positive number of test cases, T (≤10). Then T test cases follow, each consists of a single line conta…

【Pythonr入门第二讲】你好,世界

"Hello, World!" 是一种传统的编程入门示例&#xff0c;通常是程序员学习一门新编程语言时编写的第一个程序。这个程序的目标非常简单&#xff1a;在屏幕上输出 "Hello, World!" 这个字符串。尽管它非常简单&#xff0c;但具有重要的象征意义和实际价值。 …

工业生产安全-安全帽第二篇-用java语言看看opencv实现的目标检测使用过程

一.背景 公司是非煤采矿业&#xff0c;核心业务是采选&#xff0c;大型设备多&#xff0c;安全风险因素多。当下政府重视安全&#xff0c;头部技术企业的安全解决方案先进但价格不低&#xff0c;作为民营企业对安全投入的成本很敏感。利用我本身所学&#xff0c;准备搭建公司的…

Windows 服务常用工具及 nssm 使用示例

Windows 将某个应用程序设为服务运行&#xff0c;确保它在后台稳定运行&#xff0c;并且在系统重启后自动启动。 常见的工具包括 Windows 自带的服务管理器、sc 命令、srvany 和第三方工具 nssm。 1.常用 Windows 服务工具 Windows 服务管理器&#xff1a;通过图形化界面&am…

10万字208道Java经典面试题总结(2024修订版)- SpringBoot篇下篇

目录 1、Spring Boot的配置文件有哪几种格式&#xff0c;它们之间有何区别&#xff1f;2、Spring Boot如何实现跨域资源共享&#xff08;CORS&#xff09;&#xff1f;3、Spring Boot中的配置文件如何进行加密&#xff1f;4、Spring Boot如何集成Spring Data JPA&#xff1f;5、…

汽车资讯新动力:Spring Boot技术驱动

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…