MySQL基础与常用数据类型浅析

一.MySQL数据类型分类

二.数值类型 

2.1int类型 

我们使用TINYINT作为例子进行实验验证:

越界插入会直接报错,跟我们当时学习语言的时候不太一样,语言会进行隐式类型转换或截断.一般不会直接报错.其他的int类型也是同理.

说明:

  • 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
  • 可以通过UNSIGNED来说明某个字段是无符号的

2.2bit类型 

基本语法:

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

我们举个栗子:

很奇怪,我们的online明明设置的是0,为什么什么都没有显示,是因为它显示的时候默认按照ascii码来显示的,我们换成十进制显示即可看到它的值:

bit使用的注意事项:
bit字段在显示时,是按照ASCII码对应的值显示。

mysql> insert into tt4 values(65, 65);
mysql> select * from tt4;
+------+------+
| id | a      |
+------+------+
| 10 |        |
| 65 | A      |
+------+------+

如果我们有这样的值,只存放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小数类型 

因为double与float类似,所以我们这里以float与decimal作为对比:

mysql> create table tt6(id int, salary float(4,2));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt6 values(100, -99.99);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt6 values(101, -99.991); #多的这一点被拿掉了
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt6;
+------+--------+
| id | salary |
+------+--------+
| 100 | -99.99 |
| 101 | -99.99 |
+------+--------+
2 rows in set (0.00 sec)

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

mysql> create table tt7(id int, salary float(4,2) unsigned);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt7 values(100, -0.1);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+-------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------+
| Warning | 1264 | Out of range value for column 'salary' at row 1 |
+---------+------+-------------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into tt7 values(100, -0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt7 values(100, 99.99);
Query OK, 1 row affected (0.00 sec)

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
+------+-------------+-------------+

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。

三.文本,二进制类型 

 怎么理解char与varchar的区别呢?我们通过下面的例子来进行理解:

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 | 中国 |
+------+--------+

说明:

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

mysql> create table tt10(id int ,name char(256));
ERROR 1074 (42000): Column length too big for column 'name' (max = 255); use
BLOB or TEXT instead

而对于varchar:

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 | 我爱你,中国 |
+------+--------------------+

说明:

  • 关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:varchar长度可以指定为0到65535之间的值,但是有1 - 2 个字节用于记录数据大小,所以说有效字节数是65533。
  • 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
mysql> create table tt11(name varchar(21845))charset=utf8; --验证了utf8确实是不
能超过21844
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. You have to change some columns to
TEXT or BLOBs
mysql> create table tt11(name varchar(21844)) charset=utf8;
Query OK, 0 rows affected (0.01 sec)

四.日期和时间类型

常用的日期有如下三个:

  • date :日期 'yyyy-mm-dd' ,占用三字节
  • datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
  • timestamp :时间戳,从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 | -- 更新数据,时间戳会更新
成当前时间
+------------+---------------------+---------------------+

五.enum与set类型

通俗点来说,前者是'单选'类型,后者是'多选'类型.就跟我们平常的时候填写的表格一样:

enum语法:

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

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

set语法:

#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 * from votes where find_in_set('登山', hobby);
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| 雷锋 | 登山,武术 | 男 |
| Juse | 登山,武术 | 女 |
| LiLei | 登山 | 男 |
+----------+---------------+--------+

我们发现这里的where相当于我们c/c++中的if判断语句,而find_in_set仅可以查询一个元素是否在对应集合中:

mysql> select * from votes where find_in_set('登山,武术', hobby);#错误写法

那如果我们想查找既喜欢武术又喜欢登山的人该如何写呢,可以这样:

mysql> select * from votes where find_in_set('登山', hobby) and find_in_set('武术',hobby);


 

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

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

相关文章

Ubuntu 20.04离线安装Nvidia-docker

服务器因系统故障重装,安装docker容器时发现几年前的在线安装步骤不好使了,只好尝试离线安装。为了下次不卡壳,记录一下安装步骤。 先确定自己的操作系统,并确保已经安装了nvidia driver。我的操作系统是Ubuntu 20.04。 1. 下载…

6,TCP客户端

1,创建一个新的项目 2,界面设计

【dify更新问题】如何更新dify且低成本解决git pull 443问题

我的dify部署在mini server上,挂不了TZ,所以采用了如下办法 更新origin (.git/config) 地址为:https://gitee.com/dify_ai/dify.git 顺序执行 (https://docs.dify.ai/en/getting-started/install-self-hosted/docker-compose#upg…

即时通讯消息推送技术深度解析:从底层原理到行业实践-优雅草卓伊凡|片翼|搁浅

即时通讯消息推送技术深度解析:从底层原理到行业实践-优雅草卓伊凡|片翼|搁浅 引言:重新启程的即时通讯项目 优雅草科技的卓伊凡最近重启了即时通讯项目的二次开发工作,在这个万物互联的时代,消息推送通知作为IM系统的核心功能之…

Joomla jdoc 语法使用介绍

jdoc 语句包含在每个 Joomla 模板中&#xff0c;用于指示 Joomla 或其扩展的其他部分输出内容在整个网页中的位置。本文将简单的介绍一下Joomla模板开发中常用到的<jdoc>标签语法&#xff0c;并且介绍不同类型的<jdoc>标签元素的功能。 JDoc语句 一个典型的 jdoc…

Linux history 命令

Linux history 命令详解 history 是 Linux 系统中一个非常实用的命令&#xff0c;用于查看、管理和操作当前 Shell 会话中执行过的命令历史记录。它可以帮助用户快速重复执行命令、搜索历史记录、清除敏感命令等&#xff0c;极大地提高了命令行操作的效率。 一、基本用法 显示…

侧信道分析中的简单模板攻击(TA)Python实现(带测试)

一、模板攻击原理 模板攻击&#xff08;Template Attacks, TA&#xff09;是一种高效的侧信道分析方法&#xff0c;利用密码设备运行时的物理泄漏信息&#xff08;如功耗&#xff09;恢复密钥。其核心思想是通过建模密钥相关中间值的泄漏特征&#xff0c;构建攻击模板。模板攻…

AI集群全光交换网络技术原理与发展趋势研究

​ 引言 随着人工智能技术的飞速发展&#xff0c;AI训练集群对网络互连的带宽、延迟和能效提出了前所未有的挑战。全光交换网络作为一种新兴技术&#xff0c;正在成为解决这些挑战的关键方案。 全光交换网络的基本概念 全光交换网络(Optical Circuit Switch, OCS)是一种利用…

PHP Swoft2 框架精华系列:Validator 校验器详解

文章目录 校验器校验器类型@Validate 注解属性说明校验器校验主要流程系统校验器每个属性存储结构校验器规则定义,注解、注解解析器定义校验器注解使用实现一个自定义的校验器校验器注解校验器注解解析器校验器规则系统校验器Controller/Action 绑定校验器校验器 校验器是 sw…

MySQL 类型转换与加密函数深度解析

MySQL 类型转换与加密函数深度解析 一、类型转换函数详解 1. 显式类型转换 CAST 函数 CAST(expression AS type)支持类型&#xff1a;BINARY, CHAR, DATE, DATETIME, TIME, DECIMAL, SIGNED [INTEGER], UNSIGNED [INTEGER]示例&#xff1a;SELECT CAST(2023-08-15 AS DATE);…

FPGA基础 -- Verilog 行为级建模之条件语句

Verilog 的行为级建模&#xff08;Behavioral Modeling&#xff09;中的条件语句&#xff08;Conditional Statements&#xff09;&#xff0c;逐步从基础到实际工程应用&#xff0c;适合有RTL开发基础但希望深入行为建模的人。 一、行为级建模简介 行为级建模&#xff08;Beh…

linux618 NFS web.cn NFS.cn backup.cn

权限问题 推测 ssh root登录失败 root192.168.235.100s password: ▒▒▒ʱ▒▒ܾ▒ root192.168.235.100s password: ▒▒▒ʱ▒▒ܾ▒ root192.168.235.100s password: ▒▒▒ʱ▒▒ܾ▒ root192.168.235.100s password: ▒▒▒ʱ▒▒ܾ▒ root192.168.235.100s password: …

氧化镱:稀土科技的“夜视高手”

氧化镱&#xff08;Yb₂O₃&#xff09;是一种重要的稀土氧化物&#xff0c;这种略带黄色的粉末&#xff0c;既不像黄金那样耀眼&#xff0c;也不像稀土家族里的“明星”如钕、铽那样广为人知&#xff0c;却在背后默默支撑着许多高科技产业&#xff0c;特别是在红外技术领域&am…

class对象【C#】2025复习

对象 西方思想是&#xff1a;复杂的事让秘书去做就行。老板只需简单的下达命令。 代码格式如下 秘书类型 秘书A new 秘书类型(); . 秘书A.开始工作(); // 调用实例对象的方法。 特别注意的是&#xff0c;程序只会用到 秘书A&#xff0c;秘书B&…

Qt程序启动动画

一、Qt有3种方式实现程序启动动画&#xff08;介绍&#xff09; 1、QSplashScreen 静态图片(png、jpg等格式) 2、QMovie 动态图片(gif格式) 3、QAxWidget 视频(swf格式) 1.QSplashScreen 静态图片(png、jpg等格式) //创建启动动画类实例 QSplashScreen splash(QPixmap(&qu…

贪心算法经典问题

目录 贪心思想 一、Dijkstra最短路问题 问题描述&#xff1a; 贪心策略&#xff1a; 二、Prim 和 Kruskal 最小生成树问题 Prim 算法&#xff1a; Kruskal 算法&#xff1a; 三、Huffman树问题 问题描述&#xff1a; 贪心策略&#xff1a; 四、背包问题 问题描述&a…

零知开源——STM32F4实现ILI9486显示屏UI界面系列教程(一):电子书阅读器功能

本教程将详细介绍如何在零知增强板上使用3.5寸ILI9486显示屏实现电子书阅读器功能。我们将使用LVGL库构建用户界面&#xff0c;并实现翻页、进度显示等核心功能。 目录 一、硬件连接 二、软件UI组件实现 三、零知IDE配置 四、演示效果 五、常见问题解决 六、总结与扩展 一…

支持selenium的chrome driver更新到137.0.7151.119

最近chrome释放新版本&#xff1a;137.0.7151.119 如果运行selenium自动化测试出现以下问题&#xff0c;是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…

架构下的最终瓶颈:数据库如何破局?

在分布式系统和云原生架构逐渐成熟的当下&#xff0c;我们已能够灵活扩展计算资源、水平扩展服务节点、拆分业务模块等。然而&#xff0c;在经历过多轮架构优化之后&#xff0c;数据库常常成为系统的“最后瓶颈”。尤其当数据量、并发量、实时性要求剧增时&#xff0c;数据库即…

湖北理元理律师事务所小微企业债务重组方案:司法与经营的共生逻辑

小微企业债务问题常陷入“救企业还是保老板”的困局。湖北理元理律师事务所为某汽车零部件供应商设计的“经营性债务重组”方案&#xff0c;提供了创新解题思路。 核心矛盾拆解 该企业面临三重困境&#xff1a; 矛盾类型 具体表现 法律风险等级 担保链危机 老板个人担保牵…