C++学习路线(数据库部分)二

 类型

整形类型

整数类型是数据库中最基本的数据类型。标准SQL中支持INTEGER和SMALLINT这两种数据类型。MySQL数据库除了支持这两种类型以外,还扩展支持了TINYINT、MEDIUMINT和BIGINT。下表从不同整数类型的字节数、取值范围等方面进行对比。

类型名称后面的小括号   指定显示宽度(并不是该类型占用字节数)。如果不显示指定宽度则默认为tinyint(3)、 smallint(5)、 mediumint(8)、 int(11) 和 bigint(20)一般配合 zerofill 使用,顾名思义,zerofill 就是用“0”填充的意思,也就是在数字位数不够的空间用字符“0”填满

mysql> use school;   #选择数据库school

mysql> create table class6(class_id integer(5) zerofill, class_name varchar(128), class_teacher varchar(64) );         #创建表class6

 

UNSIGNED(无符号)  如果需要在字段里面保存非负数或者需要较大的上限值时,可以用此选项,它的取值范围是正常值的下限取 0,上限取原值的 2 倍,例如,tinyint 有符号范围是-128~+127,而无符号范围是 0~255。如果一个列指定为 zerofill,则 MySQL 自动为该列添加 UNSIGNED 属性。 

mysql> use school;   #选择数据库school

mysql> create table class6(id integer unsigned , name varchar(128), teacher varchar(64) );         #创建表class6

mysql> create table class7(id integer zerofill , name varchar(128), teacher varchar(64) );         #创建表class7, id类型为 int unsigned

 AUTO_INCREMENT  在需要产生唯一标识符或顺序值时,可利用此属性,这个属性只用于整数类型。AUTO_INCREMENT 值一般从 1 开始,每行增加 1。 一个表中最多只能有一个 AUTO_INCREMENT列 。对于任何想要使用 AUTO_INCREMENT 的列,应该定义为 NOT NULL,并定义为 PRIMARY KEY 或定义为 UNIQUE 键。 例如,可按下列任何一种方式定义 AUTO_INCREMENT 列: 

 浮点类型和定点数类型

数据表中用浮点数类型和定点数类型来表示小数。浮点数类型包括单精度浮点数(FLOAT型)双精度浮点数(DOUBLE型)。定点数类型就是DECIMAL型。下面从这三种类型的字节数、取值范围等方面进行对比,如表所示。

  • MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。对于decimal,M是最大位数(精度),范围是1到65。可不指定,默认值是10。D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。
  • FLOAT和DOUBLE在不指定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0,即(10, 0)

忠告: 当我们需要存储小数,并且有精度要求,比如存储金额时,通常会考虑使用DECIMAL字段类型!!!

日期和时间类型

日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型。其中,YEAR类型表示年,DATE类型表示日期,TIME类型表示时间,DATETIME和TIMESTAMP表示日期和时间。下面从这5种日期与时间类型的字节数、取值范围和零值等方面进行对比,如下表所示。

每种日期与时间类型都有一个有效范围。如果插入的值超过了这个范围,系统就会报错,并将零值插入到数据库中。不同的日期与时间类型均有不同的零值.插入日期时间时,日期年月日和时间时分秒可以使用 : - _ / 中的任意字符来分隔,如果单独插入时间,则会报错!!!

CURDATE()  - 获得当前的DATE, 可直接插入DATE 类型中.

NOW() - 获得当前的DATETIME, 可直接插入DATETIME 和TIMESTAMP类型中.

TIME() - 获取参数给定时间串中的时分秒,可直接插入TIME 类型中.

YEAR() - 获取参数给定时间串中的年份,可直接插入YEAR类型中.

MONTH() 、DAY()、HOUR()、MINUTE()、SECOND() 获取参数给定时间串中的月、日、时、分、秒值.

字符串类型

1. CHAR类型和VARCHAR类型

CHAR类型和VARCHAR类型都在创建表时指定了最大长度,其基本形式如下:

    字符串类型(M)

其中,“字符串类型”参数指定了数据类型为CHAR类型还是VARCHAR类型;M参数指定了该字符串的最大长度为M。例如,CHAR(4)就是数据类型为CHAR类型,其最大长度为4。

CHAR类型的长度是固定的,在创建表时就指定了。其长度可以是0~255的任意值。例如,CHAR(100)就是指定CHAR类型的长度为100(100个字符)。CHAR 存储值时,它们会用空格右填充到指定的长度。

CREATE TABLE students_char (id INT PRIMARY KEY AUTO_INCREMENT,name CHAR(10)
);
INSERT INTO students_char (name) VALUES ('Alice');
INSERT INTO students_char (name) VALUES ('Bob');
INSERT INTO students_char (name) VALUES ('Charlie');

VARCHAR类型的长度是可变的,在创建表时指定了最大长度。定义时,其最大值可以取0~65535之间的任意值。指定VARCHAR类型的最大值以后,其长度可以在0到最大长度之间。例如,VARCHAR(100)的最大长度是100,但是不是每条记录都要占用100个字节,而是在这个最大值范围内使用多少就分配多少。VARCHAR类型实际占用的空间为字符串的实际长度加1或2,这样即可有效节约系统的空间。

mysql> create table char_example(e_char char(5), v_char varchar(5)); #创建数据库表

mysql> insert into char_example values('12345','12345');  #正常插入数据

mysql> insert into char_example values('1 2  ','1 2  ');   #char类型会屏蔽后面隐藏的空格,varchar 不会

mysql>select concat('(',e_char, ')'), concat('(',v_char, ')')  from char_example ; #让char 后面屏蔽的空格原型毕露 

  • 1、 char一定会使用指定的空间,varchar是根据数据来定空间
  • 2、 char的数据查询效率比varchar高:varchar是需要通过后面的记录数来计算
  • 3、  如果确定数据一定是占指定长度,那么使用char类型;
  • 4、  如果不确定数据到底有多少,那么使用varchar类型;
  • 5、  如果数据长度超过255个字符而在65535之内,直接使用varchar
  • 6、  如果字符串尾部要保留空格,必须选择varchar

TEXT类型

TEXT类型是一种特殊的字符串类型,包括TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT,其长度和存储空间的对比下表所示:

 各种TEXT类型的区别在于允许的长度和存储空间不同。因此,在这几种TEXT类型中,根据需求选取既能满足需要又节省空间的类型即可。

特别注意

  1. 以上各类型无须指定长度!

允许的长度是指实际存储的字节数,而不是实际的字符个数比如假设一个中文字符占两个字节 那么TEXT 类型可存储 65535/2 = 32767  个中文字符,而varchar(100)可存储100个中文字 符,实际占200个字节,但varchar(65535) 并不能存储65535个中文字符,因为已超出表达范围.

相信大家有疑惑,text类型和varchar的类型问题?

VARCHAR 类型

  • 存储方式VARCHAR 类型根据实际存储的字符数来分配空间,并额外存储一个或两个字节来表示字符串的长度。
  • 字符数 vs 字节数VARCHAR 类型的长度是以字符数为单位指定的。例如,VARCHAR(100) 表示最多可以存储 100 个字符。
  • 多字节字符:如果使用多字节字符编码(如 UTF-8),每个字符可能占用多个字节。例如,UTF-8 编码下,一个中文字符通常占用 3 个字节,因此 VARCHAR(100) 最多可以存储 100 个字符,即 300 个字节。

TEXT 类型

  • 存储方式TEXT 类型根据实际存储的字节数来分配空间
  • 最大长度TEXT 类型的最大长度是以字节为单位的。例如,TEXT 类型最多可以存储 65535 字节。
  • 多字节字符:如果使用多字节字符编码,TEXT 类型的最大字符数会根据每个字符占用的字节数来计算。例如,UTF-8 编码下,一个中文字符占用 3 个字节,因此 TEXT 类型最多可以存储 65535 / 3 ≈ 21845 个中文字符。

mysql> use test;   #选择数据库test

mysql> create table text_example(e_text tinytext, v_char varchar(255)); #创建数据库表,e_text 可存储255个字节,v_char可存储255个字符   

mysql> insert into char_example values(90个中文字符,90个中文字符);  #插入失败,utfmb4 用3个字节表示一个中文汉字,会超出tinytext 保存范围

mysql> insert into char_example values(80个中文字符,100个中文字符);  #插入成功 

  • 1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码手机号码等定。超过255字节的只能用varchar或者text;
  • 2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。
  • 3、 text不设置长度, 当不知道属性的最大长度时,适合用text, 能用varchar的地方不用text;
  • 4、 如果都可以选择,按照查询速度: char最快, varchar次之,text最慢。

实战练习

创建一个用户信息表,用来存储用户的如下信息:姓名,手机号码,家庭地址,个人简介,性别,年龄,身份证号。数据库表名可定义为userinfo, 同时增加一个列id 用来作为每一条记录的唯一标识,并设为主键,自加!

ENUM类型

ENUM类型又称为枚举类型。在创建表时,ENUM类型的取值范围以列表的形式指定,其基本形式如下:

    属性名  ENUM('值1',  '值2', …, '值n')

其中,“属性名”参数指字段的名称,“值n”参数表示列表中的第n个值。ENUM类型的值只能取列表中的一个元素。其取值列表中最多能有65535个值。如果数据值列表在255个以内,那么一个字节就够,如果超过255但是小于65535,那么系统采用两个字节保存。列表中的每个值独有一个顺序排列的编号,MySQL中存入的是这个编号,而不是列表中的值。默认编号从1开始!Enum(,’女’,‘选择保密’)  # ‘男’=>1  ‘女’=>2  ‘选择保密’=> 3

mysql> create table enum_example (e_enum enum('男','女','选择保密') ); #创建表 

mysql> insert into enum_example values('男');  #插入记录,必须是enum 选项中的值

mysql> insert into enum_example values(1);  #插入记录可以用数值表示

mysql>select e_enum + 0  from enum_example; #查询enum 选项对应的整数值

如果ENUM类型加上了NOT NULL属性,其默认值为取值列表的第一个元素。如果不加NOT NULL属性,ENUM类型将允许插入NULL,而且NULL为默认值。

set类型

在创建表时,SET类型的取值范围就以列表的形式指定了,其基本形式如下:

    属性名  SET('值1',  '值2', …, '值n')

其中,属性名参数指字段的名称,“值n”参数表示列表中的第n个值,这些值末尾的空格将会被系统直接删除。其基本形式与ENUM类型一样。SET类型的值可以取列表中的一个元素或者多个元素的组合。取多个元素时,不同元素之间用逗号隔开。SET类型的值最多只能是由64个元素构成的组合

mysql> use test;   #选择数据库test

mysql> create table set_example (interest set('足球','追剧','篮球','撩妹') ); #创建表 

mysql> insert into set_example values( '足球,撩妹' ); #插入记录,必须是enum 选项中的值

mysql> insert into enum_example values(9);  #插入相应位效果等同,9 =>1001 选择1,4

mysql>select interest+0 from set_example;  #以整数的方式查询

 二进制类型

二进制数据和文本数据在mysql 中的最大区别在于

  1. 二进制类型存储原始的二进制数据(如图片,视频,exe文件等)文本类型(TEXT)用来存储字符字符串(如由英文字符、中文字符或其它语言字符组成的字符串)。
  2. 二进制类型没有字符集,并且排序和比较基于列值字节的数值TEXT类型有字符集,并且根据字符集的校对规则对值进行排序和比较。

二进制类型是存储二进制数据的数据类型,包括BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。二进制类型之间的对比如下表所示。

BINARY和VARBINARY类型

BINARY类型和VARBINARY类型都是在创建表时指定最大长度,其基本形式如下:

    类型 (M)   

其中,“字符串类型”参数指定数据类型为BINARY类型还是VARBINARY类型;M参数指定该二进制数的最大字节长度为M。这与CHAR类型和VARCHAR类型相似。例如,BINARY(10)就是指数据类型为BINARY类型,其最大长度为10。

  1. BINARY类型的长度是固定的,在创建表时就指定了,不足最大长度的空间由″\0″补全。例如,BINARY(50)就是指定BINARY类型的长度为50。

VARBINARY类型的长度是可变的,在创建表时指定了最大的长度,其长度可以在0到最大长度之间,在这个最大值范围

mysql> use test;   #选择数据库test

mysql> create table bin_example(e_bin  binary(5),e_varbin varbinary(5)); #创建表 

mysql> insert into bin_example values( 'ab','ab'); #插入记录,可以是普通字符串

mysql> insert into bin_example values( b'0110000101100010',b'0110000101100010'); #插入记录,可以是二进制,与上例等同

mysql> select * from bit_example ;  #以十六进制的方式显示         

BIT类型

BIT类型在创建表时指定最大长度,其基本形式如下:

    BIT(M)

其中,“M”指定该二进制数的最大存储长度为M,M的最大值为64。例如,BIT(4)就是指数据类型为BIT类型,长度为4。若字段的类型BIT(4)存储的数据是0~15,因为变成二进制之后15的值为1111,则其长度为4。如果插入的值为16,其二进制数为10000,长度为5,超过了最大长度,因此大于16的数是不能插入BIT(4)类型字段中的。

操作要点:

  1. 插入数据时,使用 b位串的方式插入相应值!
  2. 查询时,可以使用 bin() 、oct() 、hex() 函数讲字段的值转成相应的二进制、八进制和十六进制.

BLOB类型

1.以上各类型无须指定长度!

2.允许的长度是指实际存储的字节数,不用考虑字符编码。

  • 1、 binary长度固定, 即每条数据占用等长字节空间;保存长度不超过255字节的二进制数据;
  • 2、 varbinary可变长度,可以设置最大长度,最大长度65535;适合用在长度可变的二进制数据;
  • 3、 blob不设置长度, 当不知道属性的最大长度时,适合用blob, 能用varbinary的地方不用blob;
  • 4、 如果都可以选择,按照查询速度: binary最快, varbinary次之,blob最慢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/462886.html

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

相关文章

IDEA中通义灵码的使用技巧

大家好,我是 V 哥。在日常写代码的过程中,通过 AI 工具辅助开发已是当下程序员惯用的方式,V 哥在使用了众多的 AI 工具后,多数情况下,选择通义灵码来辅助开发,尤其是解释代码和生成单元测试功能甚是好用&am…

Docker篇(实际应用)

目录 一、MySQL 部署 1. 拉取 MySQL 镜像 2. 查看镜像 3. 创建 MySQL 容器 4. 进入 MySQL 容器,登陆 MySQL 5. 远程登陆 MySQL 6. 查看容器 IP 地址 二、tomcat 部署 1. 拉取 tomcat 镜像 2. 创建 tomcat 容器 3. 搭建 Tomcat 服务并部署 web 应用 三、Nginx 部署 …

Darknet 连接教程

本篇文章仅供学习,严禁用于非法用途。 1,前言: 首先明确一点,Darknet真没那么神奇,虽然有些技术文章的确很有水平,对于前端学习,软件开发以及PHP和一些服务器端维护都有许多文章,但…

江协科技STM32学习- P33 实验-软件I2C读写MPU6050

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

Hadoop生态圈框架部署(四)- Hadoop完全分布式部署

文章目录 前言一、Hadoop完全分布式部署(手动部署)1. 下载hadoop2. 上传安装包2. 解压hadoop安装包3. 配置hadoop配置文件3.1 虚拟机hadoop1修改hadoop配置文件3.1.1 修改 hadoop-env.sh 配置文件3.3.2 修改 core-site.xml 配置文件3.3.3 修改 hdfs-site…

立刻解决 gcc: error: unrecognized argument in option ‘-mabi=aapcs-linux’

unrecognized argument in option ‘-mabiaapcs-linux’ Linux 主线支持的硬件较少,一般是第三方开源( Linaro/Yocto )或者硬件厂商提供定制的嵌入式 Linux 如果确认主线支持自己的硬件,可以从 https://www.kernel.org/ 获取指定…

「Mac畅玩鸿蒙与硬件23」鸿蒙UI组件篇13 - 自定义组件的创建与使用

自定义组件可以帮助开发者实现复用性强、逻辑清晰的界面模块。通过自定义组件,鸿蒙应用能够提高代码的可维护性,并简化复杂布局的构建。本篇将介绍如何创建自定义组件,如何向组件传递数据,以及如何在不同页面间复用这些组件。 关键词 自定义组件复用组件属性传递组件通信组…

Windows版 nginx安装,启动,目录解析,常用命令

Windows版 nginx安装,启动,目录解析,常用命令 一级目录二级目录三级目录 1. 下载2. 启动方式一:方式二: 3. 验证是否启动4. 安装目录解析5. 常用命令 一级目录 二级目录 三级目录 1. 下载 官网下载:ngi…

Oracle视频基础1.3.7练习

1.3.7 看oracle是否启动构造一个pfile:boobooke.ora看spfilewilson内容修改alert log file里拷贝的参数内容,创建一个pfile boobooke.ora用新创建的pfile启动数据库,并创建新的spfile:spfilebbk.ora启动数据库,监听,看新的进程解…

【LeetCode】每日一题 2024_11_2 使两个整数相等的位更改次数(位运算/模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 题目:使两个整数相等的位更改次数 代码与解题思路 先读题: 题目要我们把 n 这个数字转换成 k 这个数字,但是只能是二进制位 1 转换成 0 纯模拟的解法: f…

鸿蒙生态下开发挑战-鸿蒙低代码开发工具展望及优势

鸿蒙生态下开发挑战 在鸿蒙生态下开发时,开发者可能会遇到多方面的挑战,这些挑战主要涉及开发工具、技术难度、生态竞争以及市场定位等方面。以下是对这些挑战的详细分析: 一、开发工具不完善 尽管鸿蒙系统的开发工具DevEco Studio在逐步完…

typescript 如何跳过ts类型检查?

文章目录 前言any类型条件判断进行使用断言加注释跳过ts检查 前言 typescript 的使用,虽然让代码更加规范,利于维护,但也给开发带来很多麻烦。为了跳过很多ts的类型检查,大家也是费尽心思,下面就介绍一些常用的方式&a…

(八)JavaWeb后端开发——Tomcat

目录 1.Web服务器概念 2.tomcat 1.Web服务器概念 服务器:安装了服务器软件的计算机服务器软件:接收用户的请求,处理请求,做出响应web服务器软件:在web服务器软件中,可以部署web项目,让用户通…

Leetcode - 142双周赛

目录 一,3330. 找到初始输入字符串 I 二,3331. 修改后子树的大小 三,3332. 旅客可以得到的最多点数 四,3333. 找到初始输入字符串 II 一,3330. 找到初始输入字符串 I 本题就是一道找规律的题,拿示例一来…

使用python画一颗圣诞树

具体效果: 完整代码: import random def print_christmas_tree(height): # 打印圣诞树的顶部 for i in range(height): # 打印空格,使树居中 for j in range(height - i - 1): print(" ", end"") # 打印星号&…

camera和lidar外参标定

雷达和相机的外参标定(外部参数标定)指的是确定两者之间的旋转和平移关系,使得它们的坐标系可以对齐。 文章目录 无目标标定livox_camera_calibdirect_visual_lidar_calibration 有目标标定velo2cam_calibration 无目标标定 livox_camera_ca…

《使用Gin框架构建分布式应用》阅读笔记:p307-p392

《用Gin框架构建分布式应用》学习第16天,p307-p392总结,总86页。 一、技术总结 1.AWS chapter 08讲使用AWS进行部署,可以根据需要选择是否阅读。因为使用到的概率很小,且还要绑卡,本人选择跳过。 2.CI/CD (1)什么…

【初阶数据结构】实现顺序结构二叉树->堆(附源码)

文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗&#xff1…

ChatGPT变AI搜索引擎!以后还需要谷歌吗?

前言 在北京时间11月1日凌晨,正值ChatGPT两岁生日之际,OpenAI宣布推出最新的人工智能搜索体验!具备实时网络功能!与 Google 展开直接竞争。 ChatGPT搜索的推出标志着ChatGPT成功消除了即时信息这一最后的短板。 这项新功能可供 …

实用篇:Postman历史版本下载

postman历史版本下载步骤 1.官方历史版本发布信息 2.点进去1中的链接,往下滑动;选择你想要的版本 例如下载v11.18版本 3.根据操作系统选择 mac:mac系统postman下载 window:window系统postman下载 4.在old version里找到对应版本下载即可 先点击download 再点击free downlo…