mysql数据类型实例分析

整数类型

数值型数据类型主要用来存储数字,mysql提供了多种数值数据类型,不同的数据类型提供不同的取值范围,可以存储的值范围越大,其所需要的存储空间也会越大。

mysql主要提供的整数类型有TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。整数类型的属性字段可以添加AUTO_INCREMENT自增约束条件。

看下下面两个表;

表一:mysql中的整数型数据类型

表二、mysql不同整数类型的取值范围

举个例子:

year int(4);

该声明指明,在year字段中的数据一般只显示4位数字的宽度;

注意点:显示宽度和数据类型取值范围是无关的。显示宽度只是指明mysql最大可能显示的数字个数,数值的位数小于指定的宽度时会由空格填充;如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能够显示出来。

例如:向year字段插入一个数值12345,当使用select查询该列值的时候,mysql显示的将是完整的带有5位数字的12345,而不是4位数字的值。

其他整数型数据类型也可以在定义表结构时指定所需要的显示宽度,如果不指定,则系统为每一种类型指定默认的宽度。

不同的整数类型有不同的取值范围,并且需要不同的存储空间,因此应该根据实际需要选择最合适的类型,这样有利于提高查询的效率和节省存储空间。在现实生活中,需要使用带小数部分的数字,而整数类型不包含小数部分。下面我们就来介绍下小数类型。

注意点:显示宽度只用于显示,并不能限制取值范围和占用空间。

浮点数类型和定点数类型

mysql中使用浮点数和定点数来表示小数。

浮点数类型有两种:

单精度浮点类型(FLOAT)

双精度浮点类型(DOUBLE)

定点数类型只有一种:

DECIMAL

浮点数类型和定点数类型都可以用(M,N)来表示。其中呢,我们用M称为精度,表示总共的位数;N称为标度,表示小数的位数。

DECIMAL类型不同于FLOAT和DOUBLE,DECIMAL实际是以串存放的,可能的最大取值范围和DOUBLRE一样,但是其有效的取值范围由M和D的值来决定。怎么说呢?

如果改变M而固定D,则其取值范围将随着M的变大而变大。

那么在mysql中,浮点数类型和定点数类型的取值范围有多大呢?

几乎正常业务情况下是不可能用完的,因为他们的取值范围如下:

FLOAT类型的取值范围:

有符号的取值范围:-3.402823466E+38 ~-1.175494351E-38

无符号的取值范围:0和1.175494351E-38 ~3.402823466E+38

DOUBLE类型的取值范围:

有符号的取值范围:-1.7976931348623157E+308 ~-2.2250738585072014E-308

无符号的取值范围:0和2.2250738585072014E-308~ 1.7976931348623157E+308

注意点:无论是定点数还是浮点数类型,如果用户指定的精度超出精度范围,则会四舍五入。

可能有点绕,举个栗子吧:

创建一个数据表为yunweijia_1,字段类型如下;

mysql> create table yunweijia_1 (x float(5,1), y double(5,1), z decimal(5,1));Query OK, 0 rows affected, 2 warnings (0.04 sec)mysql>

然后我们在这个表中插入一条数据,sql语句如下:

mysql> insert into yunweijia_1 values (6.66, 7.77, 8.888);Query OK, 1 row affected, 1 warning (0.01 sec)mysql>

看上面的提示信息,是不是在我们执行插入语句的时候,给了一个警告信息,然后我们来看下这个警告信息是什么吧;

mysql> show warnings;+-------+------+----------------------------------------+| Level | Code | Message |+-------+------+----------------------------------------+| Note | 1265 | Data truncated for column 'z' at row 1 |+-------+------+----------------------------------------+1 row in set (0.00 sec)mysql>

可以看到他提示说,z字段在插入的时候被截断了,但是x和y截断就没有提出警告。

那么查看下结果吧:

mysql> select * from yunweijia_1;
+——+——+——+
| x | y | z |
+——+——+——+
| 6.7 | 7.8 | 8.9 |
+——+——+——+
1 row in set (0.00 sec)
mysql>

可以看到分别都进行了四舍五入,这点需要注意。

FLOAT和DOUBLE在不指定精度操作时,默认会按照实际的精度(由计算机硬件和操作系统决定),DECIMAL若不指定精度则默认为(10,0);

浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;他的缺点是会引起精度问题;

注意点:在mysql中,定点数以字符串形式存储,在对精度要求比较高的时候,使用DECIMAL的类型比较好,另外,两个浮点数进行减法和比较运算时,容易出现问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。

日期与时间类型

mysql中有多种表示日期的数据类型,主要有:

DATETIME

DATE

TIMESTAMP

TIME

YEAR

比如说,当只记录年信息的时候,可以只使用YEAR类型,而没有必要使用DATE。

每一个类型都有合法的取值范围,当指定确实不合法的值时系统将“零”值插入到数据库中。

YEAR

year类型是一个单字节类型,用于表示年,在存储时只需要1字节。可以使用各种格式指定year值,如下:

1、以4位字符串或者4位数字格式表示的year,范围为1901~2155。输入格式为yyyy或者’yyyy’,例如:输入‘2022’或者2022,插入到数据库的值均为2022。

2、以2位字符串格式表示的year,范围为“00”到“99”。“00”~“69”和“70”~“99”范围的值分别被转换为“2022”~“2069”和“1970”~“1999”范围的year值。“0”与“00”的作用相同。插入超过取值范围的值将被转换成2000。

3、以两位数字表示的YEAR,范围为1~99。1~69和70~99范围的值分别被转换为200·~2069和1970~1999范围的YEAR

值。和字符相比较而言,这里的0值,将被转换成0000,而不是2000。

注意点:

怪兽AI数字人 怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

怪兽AI数字人 44 查看详情 怪兽AI数字人

两位整数范围与两位字符串范围稍有不同。例如,插入2000年,有人可能会使用数字格式的0表示year,实际上,插入数据库的值为0000,而不是所希望的2000。只有使用字符串格式的“0”或者“00”,才可以被正确的解释为2000,。非法YEAR值将被转换为0000。

栗子:

我们创建一个名为yunweijia_2的数据表,使用以下sql语句:

mysql> create table yunweijia_2 (y year);Query OK, 0 rows affected (0.04 sec)mysql>

然后我们往表中插入一条数据;

mysql> insert into yunweijia_2 values(2022), ('2022');Query OK, 2 rows affected (0.01 sec)Records: 2 Duplicates: 0 Warnings: 0mysql>

再次尝试插入一条数据;

mysql> insert into yunweijia_2 values ('2166');ERROR 1264 (22003): Out of range value for column 'y' at row 1mysql>

我们发现‘2166’超出了YEAR类型的取值范围,所以不能插入数据,这个时候我们看下mysql数据库中的数据;

mysql> select * from yunweijia_2;+------+| y |+------+| 2022 || 2022 |+------+2 rows in set (0.00 sec)mysql>

栗子:

首先我们先删除yunweijia_2数据表中的数据;

mysql> delete from yunweijia_2;Query OK, 2 rows affected (0.01 sec)mysql>

可以看到提示删除了两条数据;

然后我们再插入以下数据;

mysql> insert into yunweijia_2 values ('0'), ('00'), ('88'), ('22');Query OK, 4 rows affected (0.01 sec)Records: 4 Duplicates: 0 Warnings: 0mysql>

然后看下结果是什么:

mysql> select * from yunweijia_2;
+——+
| y |
+——+
| 2000 |
| 2000 |
| 1988 |
| 2022 |
+——+
4 rows in set (0.00 sec)
mysql>

从上面i看到,字符串‘0’和‘00’的作用相同,分别都转换成了2000年;‘88’转换成了‘1988’;‘22’转换成了‘2022’。

栗子:

老规矩,先删除表中现有的数据;

mysql> delete from yunweijia_2;Query OK, 4 rows affected (0.01 sec)mysql>

然后再插入数据:

mysql> insert into yunweijia_2 values (0), (99), (22);Query OK, 3 rows affected (0.01 sec)Records: 3 Duplicates: 0 Warnings: 0mysql>

看下结果:

mysql> select * from yunweijia_2;
+——+
| y |
+——+
| 0000 |
| 1999 |
| 2022 |
+——+
3 rows in set (0.00 sec)
mysql>

可以看到,0被转换成了0000,99被转换成了1999,22被转换成了2022。

TIME

time类型用在只需要时间信息的值,在存储时需要3字节,格式为HH:MM:SS。

其中,HH表示小时,MM表示分钟,SS表示秒。

mysql中time类型的取值范围为-838:59:59~838:59:598,小时部分为什么会这么大呢,这是因为time类型不仅可以用来表示一天的时间,还可能是某个事件过去的时间或者两个事件之间的时间间隔。

(1)‘D HH:MM:S’格式的字符串,可以使用下面任何一种“非严格”的语法:

‘HH:MM:SS’

‘HH:MM’

‘D HH:MM’

这里的D表示日,可以取0~34的值,在插入数据库时,D被转换成小时保存,格式为“D*24+HH”;

(2)‘HH:MM:SS’格式的、没有间隔符的字符串或者HHMMSS格式的数值,假定是有意义的时间。例如:’223344’被理解成‘22:33:44’,但是‘223366’是不合法的(他有一个没有意义的秒部分),存储时将变成00:00:00。

注意点:

为time列分配简写时应该注意,如果没有冒号,mysql解释值时,假定最右边的两位表示秒。如果time值中使用了冒号,则肯定被单做是当天的时间。

例如:

11:22 会被mysql解释成 00:11:22

’11:22’会被mysql解释成11:22:00

栗子

创建一个名为yunweijia_3的数据表;

mysql> create table yunweijia_3(t time);Query OK, 0 rows affected (0.03 sec)mysql>

往这个表中插入数据:

mysql> insert into yunweijia_3 values ('10:06:06'), ('22:22'), ('2 10:10'), ('3 00'), ('20');Query OK, 5 rows affected (0.01 sec)Records: 5 Duplicates: 0 Warnings: 0mysql>

看下表中的数据:

mysql> select * from yunweijia_3;+----------+| t |+----------+| 10:06:06 || 22:22:00 || 58:10:00 || 72:00:00 || 00:00:20 |+----------+5 rows in set (0.00 sec)mysql>

小提示:在使用‘D HH’格式时,小时一定要使用双位数值,如果是小于10的小时数,应在前面加0以用来补全双位数值。

举个栗子 :

首先我们删除数据表yunweijia_3里面的数据;

mysql> delete from yunweijia_3;Query OK, 5 rows affected (0.01 sec)mysql>

然后再表中插入数据:

mysql> insert into yunweijia_3 values ('101112'), (111213), ('0');Query OK, 3 rows affected (0.01 sec)Records: 3 Duplicates: 0 Warnings: 0mysql>

再次向表中插入一条数据;

mysql> insert into yunweijia_3 values (107010);ERROR 1292 (22007): Incorrect time value: '107010' for column 't' at row 1mysql>

可以看到这条数据没有插入成功,我看看下提示信息;

mysql> show warnings;+-------+------+--------------------------------------------------------+| Level | Code | Message |+-------+------+--------------------------------------------------------+| Error | 1292 | Incorrect time value: '107010' for column 't' at row 1 |+-------+------+--------------------------------------------------------+1 row in set (0.00 sec)mysql>

为什么这次会插入失败呢,是不是因为我们的分钟应该是小于60的啊,但是这里是70,所以报错了。

我们查看下这个数据库中的数据现在的展示吧:

mysql> select * from yunweijia_3;+----------+| t |+----------+| 10:11:12 || 11:12:13 || 00:00:00 |+----------+3 rows in set (0.00 sec)mysql>

又举个栗子:

我们还可以使用系统函数向time字段列插入值;

删除数据表yunweijia_3里面的数据;

mysql> delete from yunweijia_3;Query OK, 3 rows affected (0.01 sec)mysql>

然后在表中插入数据;

mysql> insert into yunweijia_3 values (CURRENT_TIME), (NOW());Query OK, 2 rows affected (0.01 sec)Records: 2 Duplicates: 0 Warnings: 0mysql>

查看下数据库中的结果;

mysql> select * from yunweijia_3;
+———-+
| t |
+———-+
| 23:03:41 |
| 23:03:41 |
+———-+
2 rows in set (0.00 sec)

mysql>

从结果中可以看到,获取系统当前的日志插入到time类型的列中。

以上就是mysql数据类型实例分析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/263143.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
composer validate命令怎么用_composer validate校验composer.json文件有效性的方法
上一篇 2026年10月12日 05:04:40
php脚本用于哪些领域
下一篇 2025年12月12日 01:44:03

相关推荐

  • mysql查询结果怎么实现多列拼接查询

    mysql查询结果怎么实现多列拼接查询mysql查询结果怎么实现多列拼接查询mysql查询结果怎么实现多列拼接查询mysql查询结果怎么实现多列拼接查询

    之前遇到过一个问题,mysql数据库中有两个表,一张地址表存放省市区等位置信息,另一张用户表里存在三个字段分别对应地址表中的三个位置信息(很奇怪的表格式),如图: 现在需要查询user表中的数据,并根据user表中省市区的值,在地址表中查询到对应的位置信息(name)并显示出来; 本人对sql并不精…

    2026年10月12日 • 用户投稿
    100
  • Mysql的timestamp时间戳2038问题怎么解决

    Mysql的timestamp时间戳2038问题怎么解决Mysql的timestamp时间戳2038问题怎么解决Mysql的timestamp时间戳2038问题怎么解决Mysql的timestamp时间戳2038问题怎么解决

    时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。生产环境中部署着各种版本的mysql,包括mysql 5.5/5.6/5.7三个大版本和n个小版本,由于mysql在向上兼容性较差,导致相同sql在不同版本上表现各异,…

    2026年10月12日 • 用户投稿
    100
  • Vue怎么实现Mysql数据库数据的模糊查询

    Vue怎么实现Mysql数据库数据的模糊查询Vue怎么实现Mysql数据库数据的模糊查询Vue怎么实现Mysql数据库数据的模糊查询Vue怎么实现Mysql数据库数据的模糊查询

    1.需求 输入框中输入数据,根据输入的结果模糊搜索数据库对应内容,实现模糊查询。 2.实现 输入框使用v-model双向绑定查询数据keyWord。 由于输入框和显示结果的不再同一view下,所以在路由跳转时将搜索结果传递给显示结果的页面,这里用的query。 search函数: 立即学习“前端免费…

    2026年10月12日 • 用户投稿
    100
  • MySQL如何更新、删除

    MySQL如何更新、删除MySQL如何更新、删除MySQL如何更新、删除MySQL如何更新、删除

    一、更新 UPDATE 表名 SET 字段1 = 值1, 字段2 = 值2,… WHERE 条件; 把id为12所对应的名字改为老哈: update users SET name = ‘老哈’ where id = 12; 二、删除 通过DELETE可以删除表中的一条记录或者多条记录 DELET…

    2026年10月12日 • 用户投稿
    000
  • mysql使用left join连接出现重复问题怎么解决

    mysql使用left join连接出现重复问题怎么解决mysql使用left join连接出现重复问题怎么解决mysql使用left join连接出现重复问题怎么解决mysql使用left join连接出现重复问题怎么解决

    mysql使用left join连接出现重复 问题描述 在使用连接查询的时候,例如以a表为主表,左连接b表,我们期望的是a表有多少条记录,查询结果就有多少条记录,但是可能会出现这样的结果,就是查询出来的记录总条数,多余a表的记录总条数,并且是查询的结果显示出来时有部分列是重复的,简单的说,就是产生了…

    2026年10月12日 • 用户投稿
    100
  • MySQL不适合构建索引及索引失效的情况有哪些

    MySQL不适合构建索引及索引失效的情况有哪些MySQL不适合构建索引及索引失效的情况有哪些MySQL不适合构建索引及索引失效的情况有哪些MySQL不适合构建索引及索引失效的情况有哪些

    结论 具体案例下文有详尽描述 不适合建立索引的场景: 数据量比较小的表不建议建立索引 有大量重复数据的字段上不建议建立索引(类似:性别字段) 需要进行频繁更新的表不建议建立索引 where、group by、order by后面的没有使用到的字段不建立索引 不要定义冗余索引 索引失效的场景: 过滤条…

    2026年10月12日 • 用户投稿
    100
  • MySQL中表连接优化 多表连接查询的性能提升技巧

    优化%ignore_a_1%多表连接查询的关键在于减少不必要的join、正确使用join类型、合理建立索引并控制返回行数。1. 避免不必要的join,只关联最终结果需要的表,可通过拆分复杂查询提升效率;2. 正确选择join类型,避免left join产生过多null和cross join导致笛卡尔…

    2026年10月12日
    000
  • 怎么给MySQL添加自定义语法

    1 背景 mysql语法解析器用的bison(即yacc)来实现的,而词法解析是自己来实现的,涉及到的token都在文件lex.h里面,然后通过lex_input_stream 里面相关的函数,解析client的sql字节流(其中会通过提前构造好的hash表帮助快速找到对应symbol,相关代码在s…

    2026年10月12日
    000
  • PHP如何通过查询MySQL来处理用户充值

    首先,我们需要确保我们已经正确安装了PHP和MySQL,并已经建立了一个可接受用户充值的MySQL数据库。管理员我们的数据库可以采用MySQL命令行或任何MySQL GUI工具。 我们可以开始编写PHP脚本查询数据库,一旦确定它可以接受充值。我们将开始创建一个简单的HTML表单,以便用户可以输入他们…

    2026年10月12日
    500
  • CentOS怎么编译安装Nginx+MySQL+PHP

    CentOS怎么编译安装Nginx+MySQL+PHPCentOS怎么编译安装Nginx+MySQL+PHPCentOS怎么编译安装Nginx+MySQL+PHPCentOS怎么编译安装Nginx+MySQL+PHP

    准备篇 一、防火墙配置 centos 7.x默认使用的是firewall作为防火墙,这里改为iptables防火墙。 1、关闭firewall: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.serv…

    2026年10月12日 • 用户投稿
    300
  • MySQL中InnoDB与MyISAM的对比分析

    对比InnoDB与MyISAM 1、 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件。分别为:表定义文件、数据文件、索引文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYI…

    2026年10月12日
    100
  • mysql的join查询和多次查询方法是什么

    mysql的join查询和多次查询方法是什么mysql的join查询和多次查询方法是什么mysql的join查询和多次查询方法是什么mysql的join查询和多次查询方法是什么

    join查询和多次查询比较 mysql多表关联查询效率高点还是多次单表查询效率高? 在数据量不够大的时候,用join没有问题,但是一般都会拉到service层上去做 第一:单机数据库计算资源很贵,数据库同时要服务写和读,都需要消耗CPU,为了能让数据库的吞吐变得更高,而业务又不在乎那几百微妙到毫秒级…

    2026年10月12日 • 用户投稿
    100
  • MySQL如何使用JSON函数

    JSON函数(5.7版本才支持) 命令:json_object(函数) 作用:转换json字符串 应用场景:指定数据转换json字符串 例子: mysql> select json_object(“name”,”andyqian”,”database”,”MySQL”);+———-…

    2026年10月11日
    1000
  • mysql存储引擎有几种

    mysql存储引擎 答:常用的主要分为两种,一种是innodb,一种是myisam,两者的主要区别是 1)myisam不支持事务处理,而innoDB支持事务处理 2)myisam 不支持外键,innoDB支持外键 3)myisam支持全文检索,而innoDB在MySQL5.6版本之后才支持全文检索 …

    2026年10月11日
    100
  • mysql comment的概念是什么

    mysql comment的概念是什么mysql comment的概念是什么mysql comment的概念是什么mysql comment的概念是什么

    comment是备注、注释的意思。在MySQL数据库中, 字段或列的注释是用属性comment来添加;创建新表的脚本中,可在字段定义脚本中添加comment属性来添加注释。要查看表中所有字段的注释,可以执行命令“show full columns from 表名”。 在mysql中,COMMENT …

    2026年10月11日 • 用户投稿
    100
  • MySQL中json_extract函数怎么使用

    1. json_extract 使用场景说明 在日常业务开发中通常mysql数据库中某个字段会需要存储json格式字符串,查询的时候有时json数据较大,每次全部取出再去解析查询效率较低,也较麻烦. 好在Mysql5.7及之后的版本里提供了json_extract函数,可以通过key查询value值…

    2026年10月11日
    100
  • Mysql怎么对json数据进行查询及修改

    Mysql怎么对json数据进行查询及修改Mysql怎么对json数据进行查询及修改Mysql怎么对json数据进行查询及修改Mysql怎么对json数据进行查询及修改

    对json数据进行查询及修改 使用 字段->’$.json属性’ 进行查询条件 使用 json_extract 函数查询,json_extract(字段, “$.json属性”) 根据json数组查询,用 JSON_CONTAINS(字段, JS…

    2026年10月11日 • 用户投稿
    100
  • Java中SonarQube的特点 分析静态扫描

    Java中SonarQube的特点 分析静态扫描Java中SonarQube的特点 分析静态扫描Java中SonarQube的特点 分析静态扫描Java中SonarQube的特点 分析静态扫描

    sonarqube在java项目中用于静态代码分析,核心作用是提前发现缺陷、提升质量并统一规范。其流程包括:1. 下载安装sonarqube并配置数据库;2. 启动服务器并通过web界面创建项目获取key;3. 安装并配置sonarscanner,将其加入环境变量;4. 在maven或gradle项…

    2026年10月11日 • 用户投稿
    300
  • mysql忘记密码重置的方法是什么

    mysql忘记密码重置的方法是什么mysql忘记密码重置的方法是什么mysql忘记密码重置的方法是什么mysql忘记密码重置的方法是什么

    当我们在使用mysql数据库时,如果忘记密码会显示下图情况 ERROR 1045 (28000): Access denied for user ‘root’@‘localhost’ (using password: YES) 一般来说我们有两种解决方法,一种是卸载后重新安装,而跳过密码验证后修改密…

    2026年10月11日 • 用户投稿
    400
  • mysql中Memory存储引擎有什么特性

    1、Memory表的每个表可以有多达32个索引。 每个索引16列,以及500字节的键长度。 2、存储引擎执行HASH和BTREE缩影。 3、表中可以有非唯一的键值。 4、表采用固定的记录长度格式。 卡奥斯智能交互引擎 聚焦工业领域的AI搜索引擎工具 36 查看详情 5、不支持BLOB或TEXT列。 …

    2026年10月11日
    200

发表回复

登录后才能评论
关注微信