【Mysql】数据库第二讲(数据库中数据类型的介绍)

news2024/10/13 0:38:20

0

数据类型

  • 1.数据类型分类
  • 2.数值类型介绍
    • 2.1tinyint类型
    • 2.2bit类型介绍
    • 2.3小数类型介绍
      • 2.3.1 float
      • 2.3.2decimal
  • 3.字符串类型介绍
    • 3.1char
    • 3.2varchar
    • 面试:char和varchar的区别
  • 4.日期和时间类型
  • 5.enum和set

1.数据类型分类

0001

2.数值类型介绍

0002

2.1tinyint类型

  • 数值越界测试:
    0003
  • 说明:
    在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
    可以通过UNSIGNED来说明某个字段是无符号的
    无符号案例:
mysql> create table tt2(num tinyint unsigned);
mysql> insert into tt2 values(-1); -- 无符号,范围是: 0 - 255
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into tt2 values(255);
Query OK, 1 row affected (0.02 sec)
mysql> select * from tt2;
+------+
| num |
+------+
|  255 |
+------+
1 row in set (0.00 sec)
  • 注意
    注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型。

2.2bit类型介绍

  • 基本语法
bit[(M)] : 位字段类型。M表示每个值的位数,范围从164。如果M被忽略,默认为1

举例:

mysql> create table tt4 ( id int, a bit(8));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt4 values(10, 10);
Query OK, 1 row affected (0.01 sec)
mysql> select * from tt4; #发现很怪异的现象,a的数据10没有出现
+------+------+
| id  | a  |
+------+------+
|  10 |   |
+------+------+
1 row in set (0.00 sec)

0005

  • bit字段在显示时,是按照ASCII码对应的值显示。0006
  • 如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间。
mysql> create table tt5(gender bit(1));
mysql> insert into tt5 values(0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt5 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt5 values(2); -- 当插入2时,已经越界了
ERROR 1406 (22001): Data too long for column 'gender' at row 1

2.3小数类型介绍

2.3.1 float

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

案例:
小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
0007
在插入第二个数-99.991时,0.001被舍弃掉了…

  • 如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99
    0008

2.3.2decimal

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数

decimal(5,2) 表示的范围是 -999.99 ~ 999.99
decimal(5,2) unsigned 表示的范围 0 ~ 999.99
decimal和float很像,但是有区别:
float和decimal表示的精度不一样

mysql> create table tt8 ( id int, salary float(10,8), salary2
decimal(10,8));
mysql> insert into tt8 values(100,23.12345612, 23.12345612);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt8;
+------+-------------+-------------+
| id  | salary   | salary2   |
+------+-------------+-------------+
|  100 | 23.12345695 | 23.12345612 | # 发现decimal的精度更准确,因此如果我们希望某
个数据表示高精度,选择decimal
+------+-------------+-------------+

0009

  • 所以在涉及到小数的使用时推荐使用decimal!

3.字符串类型介绍

3.1char

  • 语法
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
  • 案例
mysql> create table tt9(id int, name char(2));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into tt9 values(100, 'ab');
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt9 values(101, '中国');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt9;
+------+--------+
| id  | name  |
+------+--------+
|  100 | ab   |
|  101 | 中国  |
+------+--------+

0010

  • char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255

3.2varchar

  • 语法
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
  • 案例
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 | 我爱你,中国    |
+------+--------------------+

11

  • 说明:
    关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
    varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
    当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。

0012

  • 如何选择定长或变长字符串?
    如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
    如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
    定长的磁盘空间比较浪费,但是效率高。
    变长的磁盘空间比较节省,但是效率低。
    定长的意义是,直接开辟好对应的空间
    变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

面试:char和varchar的区别

区别一,定长和变长
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。

因为其长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换空间。

区别之二,存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节。

4.日期和时间类型

  • 常用的日期有如下三个:
  1. date :日期 ‘yyyy-mm-dd’ ,占用三字节
  2. datetime 时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
    t3. imestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
  • 案例:
//创建表
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 | 2017-11-12 18:28:55 | --添加数据时,时间戳自动补
上当前时间
+------------+---------------------+---------------------+
//更新数据:
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 | 2017-11-12 18:32:09 | -- 更新数据,时间戳会更新
成当前时间
+------------+---------------------+---------------------+

5.enum和set

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

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

  • 案例:
    有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择(可以多选),
    (男,女)[单选]
mysql> create table votes(
 -> username varchar(30),
 -> hobby set('登山','游泳','篮球','武术'), --注意:使用数字标识每个爱好的时候,想想
Linux权限,采用比特位位置来个set中的爱好对应起来
 -> gender enum('男','女'));   --注意:使用数字标识的时候,就是正常的数组下标
Query OK, 0 rows affected (0.02 sec)
  • 插入数据
insert into votes values('雷锋', '登山,武术', '男');
insert into votes values('Juse','登山,武术',2);
select * from votes where gender=2;
+----------+---------------+--------+
| username | hobby     | gender |
+----------+---------------+--------+
| Juse  | 登山,武术 ||
+----------+---------------+--------+

有如下数据,想查找所有喜欢登山的人:

+-----------+---------------+--------+
| username | hobby     | gender |
+-----------+---------------+--------+
| 雷锋 | 登山,武术   ||
| Juse   | 登山,武术 ||
| LiLei   | 登山 ||
| LiLei   | 篮球 ||
| HanMeiMei | 游泳 ||
+-----------+---------------+--------+
  • 使用如下查询语句:
mysql> select * from votes where hobby='登山';
+----------+--------+--------+
| username | hobby | gender |
+----------+--------+--------+
| LiLei  | 登山  ||
+----------+--------+--------+

不能查询出所有,爱好为登山的人。
集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;str_list 用逗号分隔的字符串。

mysql> select find_in_set('a', 'a,b,c');
+---------------------------+
| find_in_set('a', 'a,b,c') |
+---------------------------+
|             1 |
+---------------------------+
mysql> select find_in_set('d', 'a,b,c');
+---------------------------+
| find_in_set('d', 'a,b,c') |
+---------------------------+
|             0 |
+---------------------------+

查询爱好登山的人:

mysql> select * from votes where find_in_set('登山', hobby);
+----------+---------------+--------+
| username | hobby     | gender |
+----------+---------------+--------+
| 雷锋   | 登山,武术   ||
| Juse   | 登山,武术   ||
| LiLei  | 登山     ||
+----------+---------------+--------+

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

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

相关文章

每日刷题-3

目录 一、选择题 二、编程题 1、计算糖果 2、进制转换 一、选择题 1、 解析:在C语言中,以0开头的整数常量是八进制的,而不是十进制的。所以,0123的八进制表示相当于83的十进制表示,而123的十进制表示不变。printf函数…

费时“吃透”4个月啃烂完了这份Redis高手心法,成功上岸收到字节offer

学习一个技术,通常只接触了零散的技术点,没有在脑海里建立⼀个完整的知识框架和架构体系,没有系统观。这 样会很吃力,而且会出现一看好像自己会,过后就忘记,⼀脸懵逼。 今天小编带你⼀起吃透Redis&#xf…

这所985初试占比67%,某学院计算机学硕一志愿竟无人报名

北京科技大学(B) 考研难度(☆☆☆☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1721字,预计阅读:5分钟。 2023考情概况…

Java反编译工具 JD-GUI安装使用

我们知道,将源代码转换成二进制执行代码的过程叫“编译”,那么反编译就是将二进制执行代码转换成源代码。 在java开发里,源代码是.java文件,然后经过编译后生成计算机识别的.class文件,但是.class文件是计算机识别的我…

KT142C-sop16语音芯片ic测试板的使用说明_串口如何接线

KT142C是一个提供串口的SOP16语音芯片,完美的集成了MP3的硬解码。内置330KByte的空间,最大支持330秒的语音长度,支持多段语音,支持直驱0.5W的扬声器无需外置功放 1、软件支持串口通信协议,默认波特率9600.同时支持4个…

css自学框架之ajax获取提交数据

本小结主要自学了ajax,页面部分刷新,实现动态提交数据到服务器;动态从服务区获取数据。get,post两种传递数据方法,Json、html、text、xml等多种数据格式。 展示效果如下图: 一、Javascript代码&#xff…

线程的状态 and 线程安全

在操作系统中的线程,自身是有一个状态的~,但是Java Thread是对系统线程的封装,把这里的状态又进一步精细化了。 1.NEW 系统中的线程还没创建出来呢!只是有一个Thread对象~ public class Main1 {public static void main(String[…

日入千元什么感觉?信息安全就是这么“吸金”!

一年一次的护网行动已经火热开始了,大家还记得前段时间给大家推荐的护网吗? 现在不管是国家还是企业都很重视信息安全,毕竟科技的发展越来越迅速,我们的信息安全时时刻刻都需要保障。 据研究机构统计,截止2021年&…

数字出版的资源管理系统软件开发

出版行业资源管理系统是为出版公司和数字出版机构设计的软件工具,用于帮助管理和优化出版过程。这些系统通常具有多种功能,以支持从内容创作到分销的各个方面。以下是出版行业资源管理系统的一些主要功能,希望对大家有所帮助。北京木奇移动技…

【计算机基础知识2】操作系统、应用程序和编程语言

目录 前言 一、计算机操作系统 二、计算机应用程序 三、计算机编程语言 四、操作系统、应用程序和编程语言的相互关系 总结 前言 计算机的操作系统、应用程序和编程语言是计算机科学中非常重要的三个方面。了解这三个方面的基础知识和它们之间的相互关系,对于…

编程技巧,Python缩进规则(包含快捷键)

和其它程序设计语言​ (如 Java、C 语言)采用大括号“{}”分隔代码块不同,Python 采用代码缩进和冒号( : )来区分代码块之间的层次。 ​ 在 Python 中,对于类定义、函数定义、流程控制语句、异常处理语句等…

lvs负载均衡、LVS集群部署

四:LVS集群部署 lvs给nginx做负载均衡项目 218lvs(DR 负载均衡器) yum -y install ipvsadm(安装这个工具来管理lvs) 设置VIP192.168.142.120 创建ipvsadm的文件用来存放lvs的规则 定义策略 ipvsadm -C //清空现有…

如何使用element-ui相关组件如:el-select,el-table,el-switch,el-pagination,el-dialog

element-ui 官方链接&#xff1a; 组件 | Elementhttps://element.eleme.cn/#/zh-CN/component/installation el-select <!-- 用户类型选择框<template> 看情况使用value选择框绑定的值 命名必须是value不能改v-for"item in Options" options数据源来自于…

【dubbo3】看懂消费者如何发现提供者

服务发现机制 服务发现是RPC框架非常重要的能力。典型的服务发现一般有两种&#xff1a;接口级服务发现、应用级服务发现。  接口级服务发现典型代表是dubbo2基于zk的服务发现机制。提供者直接向注册中心注册接口信息及地址&#xff0c;消费者通过接口从注册中心拿到对应的地址…

1 Linux输入子系统

1 Linux输入子系统 https://www.cnblogs.com/beijiqie1104/p/11418082.html Linux input 子系统详解 https://www.cnblogs.com/yikoulinux/p/15208238.html

2023-9-8 求组合数(四)

题目链接&#xff1a;求组合数 IV #include <iostream> #include <algorithm>using namespace std;const int N 5010;int primes[N], cnt; bool st[N]; // 每个质数的次数 int sum[N];void get_primes(int n) {for(int i 2; i < n; i){if(!st[i]) primes[cnt]…

5.删除链表元素问题

1.删除特点节点 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]示例 2&#xff1a; 输…

【LeetCode: 207.课程表:拓扑排序+图】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【C/C++】BMP格式32位转24位

问题 如题 解决方法 bmp文件格式参考:【C/C++】BITMAP格式分析_vc++ bitmap头文件_sunriver2000的博客-CSDN博客BITMAP文件大体上分成四个部分,如下表所示。文件部分长度(字节)位图文件头 Bitmap File Header14位图信息数据头 Bitmap Info Header40调色板 Palette4*n (n≥…

Linux 安装elasticsearch-7.5.1

相关链接 官⽹&#xff1a; https://www.elastic.co/cn/downloads/elasticsearch 下载&#xff1a; wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.5.1-linux-x86_64.tar.gz 分词器&#xff1a; https://github.com/medcl/elasticsearch-an…