iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >怎么理解MYSQL数据类型存储中数值型
  • 592
分享到

怎么理解MYSQL数据类型存储中数值型

2024-04-02 19:04:59 592人浏览 泡泡鱼
摘要

怎么理解Mysql数据类型存储中数值型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。探索mysql 数值类型的存储,以及解读方

怎么理解Mysql数据类型存储中数值型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

探索mysql 数值类型的存储,以及解读方法.on Engine of myisam[@more@]1. 环境版本:
OS : linux AS4
MYsql: 5.0.51a-log
ENGINE : Myisam  DEFAULT CHARSET=latin1

2. 本章研究的数值类型对象:

TINYINT 1个字节 FIXED
SMALLINT 2个字节 FIXED
MEDIUMINT 3个字节 FIXED
INT, INTEGER 4个字节 FIXED
BIGINT 8个字节 FIXED
DECIMAL(M,N) >=4字节 FIXED

3. 数值类型: TINYINT SMALLINT MEDIUMINT INT BIGINT

这几种数据存取方式都是一样的: 高位优先存储,符号位(0正,1负)

drop table if exists heyf ;
create table heyf (id TINYINT ) type myisam  DEFAULT CHARSET=latin1;
insert into heyf values (10),(-10) ;
system hexdump /opt/mysql/data/test/heyf.MYD
------------------------------------------
0000000 0afd 0000 0000 fd00 00f6 0000 0000
000000e
------------------------------------------

其中:
ROW1:
--------------------------------
fd : 行header
0a : 值10
---------------------------------

ROW2:
--------------------------------
fd : 行header
f6 : 值-10的补码
---------------------------------

如果是正数,第1位为"0", 直接读出来即可;
如果是负数,第1位为"1", 则按常规办法将值 取反+1.

比如:
原值 原二进制 取反 加1 十进制
-------------------------------------------------------
f6 --&gt 1111 0110 --&gt 0000 1001 --&gt 0000 1010 --&gt 10

其他几个类型请读者举一反三.


4. 数值类型: DECIMAL(M,N) 或 DECIMAL(M)

4.1 存储位计算
最小分配4个字节空间,比如decimal(4,2),实际用两个字节就可以表示.但MYSQL在分配空间时还是用了4个字节.空闲部分用0填充
DECIMAL(M,N),如果9<M<17,至需要5~8个以上字节.如果18<M<36,则会需要8~12个字节.
(这里为什么要这样算,详见4.2中的实例解释)

4.2 如何读取数据.

4.2.1 读取步骤

按照定义,从磁盘读出该DECEMAL字段的所有数据(N位)后:

4.2.1.1 正数,带小数,DECIMAL(4,2)
0)以1开头,如果定义为UNSIGNED,则都为1
1)去掉第一位符号位,
2)用小数将剩余的位数分开, 前面(M位)是整数部分,后面(N位)是小数部分
(在这一步是怎么分M和N的,我们能根据字段的定义计算出来)
3)去掉小数点后面(整个字节)为0的情况,
4)将二进制转换成十进制,即可读出原值.
(注意,小数的读取方法与整数的方法一样,按二进制向十进制转换即可)

4.2.1.2 负数,带小数 DECIMAL(4,2)
0)以0开头,
1)去掉第一位符号位,
2)剩余的数取反+1 ,
3)用小数将剩余的位数分开, 前面(M位)是整数部分,后面(N位)是小数部分
(在这一步是怎么分M和N的,我们能根据字段的定义计算出来)
4)去掉小数点后面(整个字节)为0的情况,
5)将二进制转换成十进制,即可读出原值.
(注意,小数的读取方法与整数的方法一样,按二进制向十进制转换即可)

4.2.1.3 正数,不带小数, DECIMAL(N)
0)以1开头,如果定义为UNSIGNED,则都为1
1)去掉第一位符号位,
2)将剩余的数位直接按二进制向十进制转换即可

4.2.1.4 负数,不带小数, DECIMAL(N)
0)以0开头
1)去掉第一位符号位,
2)将剩余的数取反+1
3)按二进制向十进制转换即可读到原值

4.2.1.5 超长数值,如何读取
当需要表示的数值超过某个限值后,如果你按以上的方法去读取数据,会发现读出来的数值是不对的.

资料写道:
********************************************************************
high byte first, four-byte chunks.
We call the four-byte chunks "*decimal* digits".
Since 2**32 = There is an implied decimal point. Details are in /strings/decimal.c.
Example: a MySQL 5.0 DECIMAL(21,9) column containing 111222333444.555666777
looks like: hexadecimal 80 6f 0d 40 8a 04 21 1e cd 59 -- (flag + '111', '222333444', '555666777').
********************************************************************

但经过测试, 似乎是当数值<=999999999 时,我们还可以用原来的方法去读取.
一旦数值>999999999,我们就需要按CHUNK(4个字节)来读取.

详见4.2章节中的测试实例.


4.2.2 实例验证

4.2.2.1 带符号位的DECIMAL(M,N).

Drop table if exists heyf ;
create table heyf (id DECIMAL(4,2) ) type myisam ;
insert into heyf values (65),(-65),(23.34),(-23.34);
system hexdump /opt/mysql/data/test/heyf.MYD
----------------------------------------------
0000000 c1fd 0000 0000 fd00 ff3e 0000 0000 97fd
0000010 0022 0000 fd00 dd68 0000 0000
----------------------------------------------

ROW1: c1 00 00 00 : 1 1000001 00000000 00000000 00000000
ROW2: 3e ff 00 00 : 0 0111100 ffffffff 00000000 00000000
ROW3: 97 22 00 00 : 1 0010111 00100010 00000000 00000000
ROW4: 68 dd 00 00 : 0 1101000 11011101 00000000 00000000
------------------------------------------------------------
磁盘数据 符号 整数 小数 空闲 空闲

我们来看上面的方法进行读取:
ROW1:
符号位 : 1,正数.
整数部分: 1000001 = 65
小数部分: 0
原值 : 65
ROW2:
符号位 : 0,负数
取反+1 : 1000100 00000000
整数部分: 1000001 = 65
小数部分: 0
原值 : -65
ROW3:
符号位 : 1,正数
整数部分: 0010111 = 23
小数部分: 00100010 = 34
原值 : 23.34
ROW4:
符号位 : 0,负数
取反+1 : 0010111 00100010
整数部分: 0010111 = 23
小数部分: 00100010 = 34
原值 : -23,34

4.2.2.2 不带符号位的,DECIMAL(M,N)UNSIGNED.

Drop table if exists heyf ;
create table heyf (id DECIMAL(4,2) UNSIGNED ) type myisam ;
insert into heyf values (65),(23.34);
system hexdump /opt/mysql/data/test/heyf.MYD
----------------------------------------------
0000000 c1fd 0000 0000 fd00 2297 0000 0000
000000e
----------------------------------------------

ROW1: c1 00 00 00 : 1 1000001 00000000 00000000 00000000
ROW3: 97 22 00 00 : 1 0010111 00100010 00000000 00000000
------------------------------------------------------------
磁盘数据 符号 整数 小数 空闲 空闲

注意:符号位都为"1".
整数部分和小数部分,该实例与4.2.2.1中实例的取值一样,在这里不再赘述.


4.2.2.3 带符号位的, DECIMAL(M)

Drop table if exists heyf ;
create table heyf (id DECIMAL(10)) type myisam ;
insert into heyf values (65),(-65 );
system hexdump /opt/mysql/data/test/heyf.MYD
----------------------------------------------
0000000 80fd 0000 4100 fd00 ff7f ffff 00be
----------------------------------------------

ROW1: 80 00 00 00 41 --&gt 10000000 00000000 00000000 00000000 01000001
ROW2: 7f ff ff ff be --&gt 01111111 11111111 11111111 11111111 10111110

到这里,如果你认真地读完了4.2.2.1和4.2.2.2小节,那么下面的转换对你来说将不再是难事了.
正数,去符号位后直接转换成十进制;
负数,去符号位,剩余取反+1后,转换成十进制;


4.2.2.4 不带符号位的DECIMAL(M) UNSIGNED .

Drop table if exists heyf ;
create table heyf (id DECIMAL(10) UNSIGNED ) type myisam ;
insert into heyf values (65),(200000);
system hexdump /opt/mysql/data/test/heyf.MYD
----------------------------------------------
0000000 80fd 0000 4100 fd00 0080 0d03 0040
----------------------------------------------

ROW1: 80 00 00 00 41
ROW2: 80 00 03 0d 40

在这里用了五个字节来表示DECIMAL(10).关于原数值,我想大家应该都能看出来了.
0X41 --&gt 65
0X30d40 --&gt 20000

4.2.2.5 超长数值的读取(>999999999)

Drop table if exists heyf ;
create table heyf (id DECIMAL(10) UNSIGNED ) type myisam ;
insert into heyf values (999999999),(1000000000),(2147483648);
system hexdump /opt/mysql/data/test/heyf.MYD
----------------------------------------------
0000000 80fd 9a3b ffc9 fd00 0081 0000 0000 82fd
0000010 ca08 006c
----------------------------------------------
ROW1: 80 3b 9a c9 ff --&gt 10000000 00111011 10011010 11001001 11111111
ROW2: 81 00 00 00 00 --&gt 10000001 00000000 00000000 00000000 00000000
ROW2: 82 08 ca 6c 00 --&gt 10000010 00001000 11001010 01101100 00000000

试着用原来的方法将数据进行转换:
ROW1: select conv(000000000111011100110101100100111111111,2,10) ;
--&gt 999999999 正确
ROW2: select conv(000000100000000000000000000000000000000,2,10) ;
--&gt 4294967296 与原值不符
ROW3: select conv(000001000001000110010100110110000000000,2,10) ;
--&gt 8737418240 与原值不符

其实,正如上面所说的,如果数值超过999999999,那么需要按CHUNK(4个字节)来读取,并在最后将数拼起来.
比如我们读第三行数据:
从右到左读:
1)先读4个字节:00001000 11001010 01101100 00000000 --&gt 147483648
2)再读剩余的1个字节:0000010 --&gt 2
把以上两个结果拼起来: "2" || "147483648" = "2147483648" 这里才与原值相符

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么理解MYSQL数据类型存储中数值型

本文链接: https://www.lsjlt.com/news/66655.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么理解MYSQL数据类型存储中数值型
    怎么理解MYSQL数据类型存储中数值型,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。探索MYSQL 数值类型的存储,以及解读方...
    99+
    2024-04-02
  • MySQL中BIGINT数据类型如何存储整数值
    目录前言mysql BIGINT例子示例 1示例 2示例 3示例 4结论前言 本文重点介绍 MySQL BIGINT 数据类型,并研究我们如何使用它来存储整数值。我们还将了解它的范围、存储大小和各种属性,包括有符号、无符...
    99+
    2024-04-02
  • 在 MySQL 数据库中存储货币值的最佳数据类型?
    为了表示金钱,我们需要使用 Decimal (TotalDigitsinteger, DigitsAfterDecimalinteger) 方法。 假设我们需要显示值 345.66。为此,计算有多少位可用。值345.66,一共有5位,小数点...
    99+
    2023-10-22
  • MYSQL中怎么利用DATE实现数据类型存储
    这篇文章给大家介绍MYSQL中怎么利用DATE实现数据类型存储,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 MYSQL-数据类型存储-DATE on E...
    99+
    2024-04-02
  • C语言中sizeof与整型数据存储及数据类型取值范围
    这篇文章主要讲解了“C语言中sizeof与整型数据存储及数据类型取值范围”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中sizeof与整型数据存储及数据类型取值范围”吧!1.关键字si...
    99+
    2023-07-02
  • Python数据类型 -数值类型(整数,
    一、整数:1)整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。如:num01 =100...
    99+
    2023-01-31
    整数 数值 数据类型
  • 浅谈Redis存储数据类型及存取值方法
    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) String存取值: 是 redi...
    99+
    2024-04-02
  • java保存json类型数据到mysql数据库,mysql保存json类型数据
    1.首先在对应表添加一个json类型字段 2.在java对应的实体类添加对应的字段,重点是加上(typeHandler = JacksonTypeHandler.class)这个注解 不然的话保存...
    99+
    2023-09-04
    java mysql 数据库
  • mysql中clob类型数据怎么处理
    在MySQL中,CLOB(Character Large Object)类型数据通常指代文本类型数据,例如长文本、大段文本或者大型文...
    99+
    2024-04-09
    mysql
  • prometheus数据存储类型有哪些
    Prometheus 中的数据存储类型有以下几种: Memory:内存存储类型是最基本的存储类型,用于保存最近的指标数据。这种存储...
    99+
    2024-04-09
    prometheus
  • 如何在 PHP 中存储 NumPy 数据类型?
    在 PHP 中存储 NumPy 数据类型是一个常见的需求,因为 NumPy 提供了很多高效的数学运算和数据处理功能,而 PHP 是一种常用的服务器端编程语言,它可以方便地与 Web 应用程序集成。在本文中,我们将介绍如何在 PHP 中存储 ...
    99+
    2023-10-02
    数据类型 存储 numpy
  • 如何在 ASP 中存储 numy 数据类型?
    ASP 是一种流行的服务器端脚本语言,它的运行环境是 Microsoft Windows。在 ASP 中,我们可以使用多种数据类型来存储数据,包括数字、字符串、布尔值和日期等。但是,如果我们需要在 ASP 中存储 numy 数据类型,该怎么...
    99+
    2023-08-03
    存储 numy 数据类型
  • C#数据类型怎么理解
    这篇文章主要讲解了“C#数据类型怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#数据类型怎么理解”吧!主要的不同点有:◆常量声明:Java 为此而使用 final 关键字,而 C#...
    99+
    2023-06-17
  • MySQL 数值类型溢出处理
    推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少?来,考考大家一个问题,在 MySQL 中当某一列设置为 int(0) 时会发生什么 ?为了演示这个问题,我们先要创建一个表 DROP TABLE IF EXISTS `na...
    99+
    2023-06-02
  • Oracle基本数据类型存储格式浅析——RAW类型
    原文链接: https://www.modb.pro/db/23307xy 摘要:描述Oracle的RAW类型存储格式...
    99+
    2024-04-02
  • 【mysql】—— 数据类型详解
    序言: 本期我将大家认识关于 mysql 数据库中的基本数据类型的学习。通过本篇文章,我相信大家对mysql 数据类型的理解都会更加深刻。 目录 (一)数据类型分类 (二)数值类型 1、tinyint类型 2、bit类型 3、小数类型 ...
    99+
    2023-08-31
    mysql 数据库
  • MySQL数据类型对应Java数据类型
    ### 数值类型 - TINYINT:大小(1byte),范围(有符号为-128到127,无符号为0到255),用于小整数值,对应于java中的Byte类型; - SMALLINT:大小(2byte),范围(有符号为-32768到3276...
    99+
    2023-09-07
    mysql java 数据库
  • C语言深入探究sizeof与整型数据存储及数据类型取值范围
    目录1.关键字sizeof2.整型数据存储深入3.数据类型取值范围深入1.关键字sizeof sizeof 与 strlen 是我们日常打代码时经常使用到的两个“工具&r...
    99+
    2024-04-02
  • Prometheus数据存储如何指定类型
    在Prometheus中,数据存储的类型由Metric的名称和标签来指定。每个Metric都有一个名称和一组标签,用来唯一标识该Me...
    99+
    2024-03-14
    prometheus
  • mysql中整数数据类型tinyint详解
    目录1.1 tinyint类型说明1.2 实践环境说明1.3 加unsigned属性1.3.1 SQL模式开启严格模式1.3.2 SQL模式未开启严格模式1.4 加zerofill属...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作