【MySQL学习笔记】(四)MySQL数据类型

这篇具有很好参考价值的文章主要介绍了【MySQL学习笔记】(四)MySQL数据类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 数据类型分类

【MySQL学习笔记】(四)MySQL数据类型

2 数值类型

【MySQL学习笔记】(四)MySQL数据类型

2.1 tinyint 类型

数值测试

mysql> create table tt1(num tinyint);//建立表,num的类型是tinyint
Query OK, 0 rows affected (0.02 sec)

mysql> insert  into tt1 values(1);//插入数值
Query OK, 1 row affected (0.00 sec)

mysql> insert  into tt1 values(128); // 越界插入,报错
ERROR 1264 (22003): Out of range value for column 'num' at row 1

mysql> select * from tt1;
+------+
| num |
+------+
|    1 |
+------+

1 row in set (0.00 sec)

注:在MySQL中,如果输入的数值不合法,会直接不允许插入。并不会像C/C++语言那样发生截断。这也说明了,凡是MySQL有的数值,必定是合法的。

在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.2 bit 类型

语法:

bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果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)

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 小数类型

1)float
语法:

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

案例:
小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。

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)

2) decimal

语法:

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

说明:float表示的精度大约是7位。

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

建议:如果希望小数的精度高,推荐使用decimal。

2.4 字符串类型

1) char
语法:

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

注意:mysql中的字符,指的是一个符号,不论是英文还是中文。
比如:‘a’ 是一个字符 ,'中’也是一个字符,虽然采用utf-8编码英文占1个字节,中文占3个字节,但是在MySQL中,都认为是一个字符,所以上面的案例中才能成功插入。
utf-8编码中文占3个字节,GBK编码中文占2个字节

2.5 varchar

语法:

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

注意:这里是65535个字节,也就是最大长度是65535/3=21845个字符。(MySQL中,如果是UTF-8编码一个字符最大可占3个字节)

案例:

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 - 3 个字节用于记录数据大小,所以说有效字节数是65532。
当我们的表的编码是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)

2.6 char和varchar比较

【MySQL学习笔记】(四)MySQL数据类型

如何选择定长或变长字符串?

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

2.6 日期和时间类型

常用的日期有如下三个:

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 | -- 更新数据,时间戳会更新成当前时间
+------------+---------------------+---------------------+

2.6 enum 和 set

语法:

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

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

说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。

案例:

mysql> create table votes(
   -> username varchar(30),
   -> hobby 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;//查找gender=2的数据
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| Juse     | 登山,武术       ||
+----------+---------------+--------+

2.6.1 集合查询使用find_ in_ set函数

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

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

查询爱好登山的人:文章来源地址https://www.toymoban.com/news/detail-509980.html

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

到了这里,关于【MySQL学习笔记】(四)MySQL数据类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 读高性能MySQL(第4版)笔记06_优化数据类型(上)

    3.2.2.1. 字符集和排序规则(collation)使字符型数据的比较更复杂 3.2.2.2. 应该将日期和时间存储为MySQL的内置类型而不是字符串类型 3.2.2.3. 应该用整型数据存储IP地址 4.1.1.1. 使用8、16、24、32和64位存储空间 5.2.4.1. VARCHAR(1000)的列则需要1002个字节,因为需要2字节存储长度

    2024年02月09日
    浏览(50)
  • python教程 入门学习笔记 第4天 数据类型 获取数据类型 字符串拼接

    数据类型 1、能直接处理的基本数据类型有5个:整型、浮点型、字符串、布尔值、空 1)整型(int)=整数,例如0至9,-1至-9,100,-8180等,人数、年龄、页码、门牌号等 没有小数位的数字,是整型 2)浮点型(float)=小数,例如金额、身高、体重、距离、长度、π等 精确到小

    2024年02月14日
    浏览(50)
  • 机器学习笔记 - 基于自定义数据集 + 3D CNN进行视频分类

            这里主要介绍了基于自定义动作识别数据集训练用于视频分类的 3D 卷积神经网络 (CNN) 。3D CNN 使用三维滤波器来执行卷积。内核能够在三个方向上滑动,而在 2D CNN 中它可以在二维上滑动。         这里的模型主要基于D. Tran 等人2017年的论文“动作识别的时空卷积研

    2024年01月23日
    浏览(48)
  • MySql学习2:SQL分类、数据库操作、表操作、数据的增删改查

    SQL分类: DDL:数据定义语言,用来定义数据库对象(数据库、表、字段) DML:数据操作语言,用来对数据库表中的数据进行增删改 DQL:数据库查询语言,用来查询数据库表中的记录 DCL:数据控制语言,用来创建数据库用户、控制数据库的访问权限 查询所有数据库 查询当前

    2024年02月11日
    浏览(52)
  • Python学习笔记(2)--字面量,注释,变量,数据类型,数据类型转换,标识符,运算符

    传送门==B站黑马python入门教程 1.字面量 字面量 : 代码中被固定写的值 python常用的6种数据类型为 数字,字符串,列表,元组,集合,字典 目前基础部分学习 字符串,整数,浮点数 即可 字符串 :(文本),由任意数量的 字符 (示例:中文/英文/各类符号/数组)组成; 在 python 中,字符串需要用双

    2024年02月11日
    浏览(63)
  • C#学习笔记--复杂数据类型、函数和结构体

    特点:多个数据变量地一个集合体,可以自己命名 种类:枚举、数组和结构体 枚举:整型常量的集合 数组:任意变量类型的顺序存储的数据集合 结构体:任意变量类型的数据组合成的数据块 枚举 : 枚举可以方便表示对象的各种状态,本质还是一种变量。 例如我们可以用

    2024年02月08日
    浏览(43)
  • 机器学习笔记 - 使用CLIP在没有数据的情况下创建图像分类器

            想象一下,如果我们现在需要对人们是否戴眼镜进行分类,但您没有数据或资源来训练自定义模型。该怎么办?这里我们了解如何使用预先训练的 CLIP 模型来创建自定义分类器,而无需任何培训。这种方法称为 零样本 图像分类,它可以对原始 CLIP 模型训练期间未

    2024年02月14日
    浏览(33)
  • Verilog数据类型/常量/变量[学习笔记day3]

    1 数据类型 数据类型是用来表示数字电路中的 数据存储 和 传递单元 。 Verilog HDL中共有19种数据类型,其中 最基本的有4种 : 常:integer型 parameter型 变:reg型 wire型 其他:large, medium, scalared, small, time, tri, tri0, tri1, triand, trior, trireg, vectored, wand, wor等。 2 常量 在程序运行过程中

    2024年02月05日
    浏览(42)
  • Python学习笔记_基础篇(三)_数据类型之列表

    一.基本数据类型 整数:int 字符串:str(注:t等于一个tab键) 布尔值: bool 列表:list (元素的集合) 列表用[] 元祖:tuple 元祖用() 字典:dict 注:所有的数据类型都存在想对应的类列里 二.列表所有数据类型: 基本操作: 索引 切片 追加 删除 长度 切片 循环 包含 list 三

    2024年02月12日
    浏览(43)
  • 深度学习笔记(七)——基于Iris/MNIST数据集构建基础的分类网络算法实战

    文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 在神经网络的构建过程中,都避不开以下几个步骤: 导入网络和依赖模块 原始数据处理和清洗 加载训练和测试数据 构建网络

    2024年01月18日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包