ホームページ データベース mysql チュートリアル Oracle基本数据类型存储格式浅析(二)数字类型

Oracle基本数据类型存储格式浅析(二)数字类型

Jun 07, 2016 pm 03:44 PM
oracle 基本 ストレージ 番号 データ フォーマット タイプ

这篇文章主要描述NUMBER类型的数据和如何在数据库中存储的。 1 number类型的组成 Oracle的number类型最多由三个部分构成,这三个部分分别是 “最高位表示位”、“数据部分”、“符号位”。 其中负数存在符号位,正数没有符号位。 另外,数0比较特殊,它只包

这篇文章主要描述NUMBER类型的数据和如何在数据库中存储的。

1 number类型的组成

Oracle的number类型最多由三个部分构成,这三个部分分别是“最高位表示位”、“数据部分”、“符号位”。

其中负数存在符号位,正数没有符号位。

另外,数值0比较特殊,它只包含一个数值最高位表示位80,没有数据部分,也没有符号位。

1.1 最高位表示位

正数的最高位表示位大于80,负数的最高位表示位小于80。

一个正数的最高位是个位的话,则最高位表示位为0X C1(即十进制的193),百位、万位依次为C2、C3,百分位、万分为依次为C0、BF。

一个负数的最高位为个位的话,最高位表示位为0X 3E(即十进制的62),百位、万位依次为3D、3C,百分位、万分位依次为3F、40。

1.2 数据部分

数据部分每一字节都表示2位数字。(由)这个两位数字(组成的一个数值)的范围可能是从0到99,如果是数据本身是正数,则分别用六进制的1到64表示,如果数据本身是负数,则使用进制65到2表示。

注意:

在数据部分中,同样是(数据部分中的)0,在正数时用0x01表示,而在负数时用0x65表示。

在数据部分中,同样是数据部分中的)99,在正数时用0x64表示,而在负数时用0x2表示。

1.3 符号位

当数字为负数,才有符号位。符号位用0x66表示。

注意:用0x66表示,因为同样的一个数字,在正数与负数表示时,它们之和为0x66。例如:1的数据部分表示为0x02,而-1的数据部分表示为0x64。这个两个数之和为0x66。

2 实验过程

上面的这些是我通过DUMP结果总结出来的,对于上面提到的这些关系常数,Oracle之所以这样选择是有道理的,我们后面根据例子也可以推导出来,而且会进一步说明为什么会采用这种方式表示。这里列出的意思是使大家先对NUMBER类型数据有一个大概的了解。

下面我们通过一个例子详细说明:

SQL> create table test_number (number_col number);

Table created

SQL> insert into test_number values (0);

1 row inserted

SQL> insert into test_number values (1);

1 row inserted

SQL> insert into test_number values (2);

1 row inserted

SQL> insert into test_number values (25);

1 row inserted

SQL> insert into test_number values (123);

1 row inserted

SQL> insert into test_number values (4100);

1 row inserted

SQL> insert into test_number values (132004078);

1 row inserted

SQL> insert into test_number values (2.01);

1 row inserted

SQL> insert into test_number values (0.3);

1 row inserted

SQL> insert into test_number values (0.00000125);

1 row inserted

SQL> insert into test_number values (115.200003);

1 row inserted

SQL> insert into test_number values (-1);

1 row inserted

SQL> insert into test_number values (-5);

1 row inserted

SQL> insert into test_number values (-20032);

1 row inserted

SQL> insert into test_number values (-234.432);

1 row inserted

SQL> commit;

Commit complete

SQL> col d_number format a50

SQL> select number_col, dump(number_col, 16) d_number from test_number;

NUMBER_COL D_NUMBER

---------- --------------------------------------------------

         0 Typ=2 Len=1: 80

         1 Typ=2 Len=2: c1,2

         2 Typ=2 Len=2: c1,3

        25 Typ=2 Len=2: c1,1a

       123 Typ=2 Len=3: c2,2,18

      4100 Typ=2 Len=2: c2,2a

 132004078 Typ=2 Len=6: c5,2,21,1,29,4f

      2.01 Typ=2 Len=3: c1,3,2

       0.3 Typ=2 Len=2: c0,1f

   1.25E-6 Typ=2 Len=3: be,2,1a

115.200003 Typ=2 Len=6: c2,2,10,15,1,4

        -1 Typ=2 Len=3: 3e,64,66

        -5 Typ=2 Len=3: 3e,60,66

    -20032 Typ=2 Len=5: 3c,63,65,45,66

  -234.432 Typ=2 Len=6: 3d,63,43,3a,51,66

15 rows selected

3 结论解释

下面根据例子得到的结果,对每行进行说明。首先说明两点基本的。DUMP函数返回的TYPE=2表示DUMP的数据类型是NUMBER,LENGTH=N表示数值在数据库中存储的长度是N。

3.1 Dump(0)

DUMP(0) 的结果是0x80,在前面已经提到,0只有高位表示位,没有数据位。由于0的特殊,既不属于正数,也不属于负数,因此使用高位表示位用80表示就足够了,不会和其它数据冲突,Oracle出于节省空间的考虑将后面数据部分省掉了。

但是为什么Oracle选择0x80表示0呢?我们知道正数和负数互为相反数,每个正数都有一个对应的负数。因此如果我们要使用编码表示数值,则表示正数和负数的编码应该各占一半,这样才能保证使Oracle表示数据范围是合理的。而0x80的二进制编码是1000 0000,正好是一个字节编码最大值的一半,因此,Oracle选择0x80来表示0,是十分有道理的。

注释:

0x80的二进制编码是1000 0000,正好是一个字节编码最大值的一半,因为

1·0111 1111共2的8次方-1个(Oracle底层是用C语言实现的,我们知道二进制0在C语言中用作字符串终结符,Oracle为了避免这个问题,故将0这个值去掉),而1000 0001·1111 1111也共2的8次方-1个。

3.2 Dump(1)

DUMP(1)的结果是0xc102,0xc1表示了最高位个位,0x2表示数值是1。首先,Oracle为什么用C1表示个位呢?其实,道理和刚才的差不多。采用科学计数法,任何一个实数S都可以描述为A.B×10n,A 表示整数部分,B表示小数部分,而N表示10的指数部分。当S大于1时,N大于等于0,S小于1时,N小于0。也就是说,采用指数的方式表示,N大于0和 N小于0的情况各占一半左右时,Oracle所表示的范围最广(?)。因此,Oracle选择了C1表示个位是最高位的情况。

SQL> SELECT TO_CHAR(ROUND(TO_NUMBER('81', 'XXX') + (TO_NUMBER('FF', 'XXX') - TO_NUMBER('81', 'XXX') + 1)/2), 'XX') VALUE FROM DUAL;

VALUE

-----

   C1

为什么ORACLE使用0x2表示1,而不直接使用0x1表示1呢?Oracle每个字节表示2位数,因此对于这个2位数,出现的可能是0~99共100种可能,问题出在0这里。

Oracle底层是用C语言实现的,我们知道二进制0在C语言中用作字符串终结符,Oracle为了避免这个问题,因此使用了0x1表示0,并依次类推,使用0x64表示99。

3.3 Dump(2)

DUMP(2)的结果是0xc103。

3.4 Dump(25)

DUMP(25)的结果是0xc11a。前面提到,数据部分是以2位为最小单位保存的。因此对于25来说,最高位表示位仍然是个位,个位上的值是25,根据上面推出的规则,25在存储为0xc11a。

SQL> SELECT TO_CHAR(25 + 1, 'xx') VALUE FROM DUAL;

VALUE

-----

1a

3.5 Dump(123)

DUMP(123)的结果是0xc20218。由于123最高为是百位,所以最高位表示位为0xc2,百位上是1,用0x02表示,个位上是23,用0x18表示。

3.6 Dump(4100)

DUMP(4100)的结果是0xc22a。

注意一点,如果数字最后数位上如果是0,Oracle出于节省空间的考虑不会存储。比如:4100只保存百位上的41,12000000只保存百位位上的12,512000只保存万位上的51和百位上的20。

3.7 Dump(132004078)

DUMP(132004078)的结果是0xc5022101294f。最高位是亿位,因此用0xC5表示,亿位上是1用0x02表示,百万位上是32用0x21表示,万位上是0用0x01表示,百位上是40用0x29表示,个位上78用0x4F表示。

注意:中间数位上的0不能省略。

3.8 Dump(2.01)

DUMP(2.01)的结果是0xc10302。最高位是个位用0xC1表示,个位上是2用0x03表示,百分位上是1用0x02表示。

注意:个位下面一位是百分位不是十分位。

3.9 Dump(0.3)

DUMP(0.3)的结果是0xc01f。最高位是百分位,使用0xC0表示,百分位上是30用0x1F表示。

3.10 DUMP(0.00000125)

DUMP(0.00000125)的结果是0xbe021a。最高位是百万分位,用0xBE表示,最高位上的1用0x02表示,25用0x1a表示。

3.11 DUMP(115.200003)

DUMP(115.200003)的结果是0xc20210150104。





3.12 DUMP(-1)

DUMP(-1)的结果是0x3e6466。最高位个位,用0x3E表示,64表示个位上是1,66是符号位,表示这个数是负数。

负数和正数互为相反数,负数的最高位表示位和它对应的相反数的最高位相加的值是FF。 1的最高位表示位是C1,-1的最高位表示位是3E。负数中1用64表示。负数中的数值和它相反数的数据相加是0x66,也就是符号位。正数1用0x02 表示,负数1用0x64表示,二者相加是0x66。负数多个一个标识位,用0x66表示。由于正数的表示范围是0x01到0x64,负数的表示范围是 0x65到0x02。因此,不会在表示数字时出现的0x66表示。

3.13 DUMP(-5)

DUMP(-5)的结果是0x3e6066。0x3e表示最高位是个位,0x60表示个位上是5,0x66是符号标识位。0x3E加0xC1是0xFF。0x60加0x06的结果是0x66。

3.14 DUMP(-20032)

DUMP(-20032) 的结果是0x3c63654566。最高位是万位,正数的万位是0xC3,因此负数的万位是0x3C。万位上是2,正数用0x03表示,负数为0x63,百位上是0,正数用0x01表示,负数使用0x65表示,个位上是32,正数用0x21表示,负数使用0x45表示。0x66是负数表示位。

3.15 DUMP(-234.432)

DUMP(-234.432)的结果是0x3d63433a5166。


ORACLE数值类型详解--NUMBER、BINARY_FLOAT、BINARY_DOUBLE、BINARY_INTEGER、FLOAT


 

转贴:http://www.itpub.net/forum.php?mod=viewthread&tid=308317

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Oracle データベースのログはどのくらいの期間保存されますか? Oracle データベースのログはどのくらいの期間保存されますか? May 10, 2024 am 03:27 AM

Oracle データベース ログの保存期間は、次のようなログのタイプと構成によって異なります。 REDO ログ: 「LOG_ARCHIVE_DEST」パラメータで構成された最大サイズによって決定されます。アーカイブ REDO ログ: 「DB_RECOVERY_FILE_DEST_SIZE」パラメータで構成された最大サイズによって決まります。オンライン REDO ログ: アーカイブされず、データベースの再起動時に失われます。保持期間はインスタンスの実行時間と一致します。監査ログ: 「AUDIT_TRAIL」パラメータによって構成され、デフォルトで 30 日間保持されます。

Oracle データベースの起動手順の順序は次のとおりです。 Oracle データベースの起動手順の順序は次のとおりです。 May 10, 2024 am 01:48 AM

Oracle データベースの起動シーケンスは次のとおりです。 1. 前提条件を確認します。 3. データベース インスタンスを起動します。 5. データベースに接続します。サービスを有効にします (必要な場合)。 8. 接続をテストします。

Oracle データベース サーバーのハードウェア構成要件 Oracle データベース サーバーのハードウェア構成要件 May 10, 2024 am 04:00 AM

Oracle データベース サーバーのハードウェア構成要件: プロセッサ: マルチコア、少なくとも 2.5 GHz のメイン周波数 大規模なデータベースの場合は、32 コア以上が推奨されます。メモリ: 小規模データベースの場合は少なくとも 8 GB、中規模のデータベースの場合は 16 ~ 64 GB、大規模なデータベースまたは重いワークロードの場合は最大 512 GB 以上。ストレージ: SSD または NVMe ディスク、冗長性とパフォーマンスのための RAID アレイ。ネットワーク: 高速ネットワーク (10GbE 以上)、専用ネットワーク カード、低遅延ネットワーク。その他: 安定した電源、冗長コンポーネント、互換性のあるオペレーティング システムとソフトウェア、放熱と冷却システム。

Oracle にはどれくらいのメモリが必要ですか? Oracle にはどれくらいのメモリが必要ですか? May 10, 2024 am 04:12 AM

Oracle が必要とするメモリーの量は、データベースのサイズ、アクティビティー・レベル、および必要なパフォーマンス・レベル (データ・バッファー、索引バッファーの保管、SQL ステートメントの実行、およびデータ・ディクショナリー・キャッシュの管理) によって異なります。正確な量は、データベースのサイズ、アクティビティ レベル、および必要なパフォーマンス レベルによって影響されます。ベスト プラクティスには、適切な SGA サイズの設定、SGA コンポーネントのサイズ設定、AMM の使用、メモリ使用量の監視などが含まれます。

Oracle のスケジュールされたタスクは、作成ステップを 1 日に 1 回実行します。 Oracle のスケジュールされたタスクは、作成ステップを 1 日に 1 回実行します。 May 10, 2024 am 03:03 AM

Oracle で 1 日に 1 回実行されるスケジュールされたタスクを作成するには、次の 3 つの手順を実行する必要があります。 ジョブを作成します。ジョブにサブジョブを追加し、そのスケジュール式を「INTERVAL 1 DAY」に設定します。ジョブを有効にします。

Oracle データベースを使用するために必要なメモリの量 Oracle データベースを使用するために必要なメモリの量 May 10, 2024 am 03:42 AM

Oracle データベースに必要なメモリの量は、データベースのサイズ、ワークロードの種類、同時ユーザーの数によって異なります。一般的な推奨事項: 小規模データベース: 16 ~ 32 GB、中規模データベース: 32 ~ 64 GB、大規模データベース: 64 GB 以上。考慮すべきその他の要素には、データベースのバージョン、メモリ最適化オプション、仮想化、ベスト プラクティス (メモリ使用量の監視、割り当ての調整) などがあります。

70B モデルは数秒で 1,000 トークンを生成、コード書き換えは GPT-4o を超える、OpenAI が投資したコード成果物である Cursor チームによる 70B モデルは数秒で 1,000 トークンを生成、コード書き換えは GPT-4o を超える、OpenAI が投資したコード成果物である Cursor チームによる Jun 13, 2024 pm 03:47 PM

70B モデルでは、数秒で 1,000 個のトークンを生成でき、これはほぼ 4,000 文字に相当します。研究者らは Llama3 を微調整し、高速化アルゴリズムを導入しました。ネイティブ バージョンと比較して、速度は 13 倍高速になりました。速いだけでなく、コード書き換えタスクのパフォーマンスは GPT-4o をも上回ります。この成果は、人気の AI プログラミング成果物 Cursor を開発したチーム、anysphere によるもので、OpenAI も投資に参加しました。有名な高速推論アクセラレーション フレームワークである Groq では、70BLlama3 の推論速度は 1 秒あたり 300 トークンを超える程度であることを知っておく必要があります。 Cursor の速度により、ほぼ瞬時に完全なコード ファイル編集を実現すると言えます。カースと言うと良い奴だと言う人もいる

AI スタートアップ企業は一斉に OpenAI に転職し、イリヤが去った後にセキュリティ チームが再編成されました。 AI スタートアップ企業は一斉に OpenAI に転職し、イリヤが去った後にセキュリティ チームが再編成されました。 Jun 08, 2024 pm 01:00 PM

先週、社内の辞任と社外からの批判が相次ぐ中、OpenAIは内外のトラブルに見舞われた。 - 未亡人姉妹への侵害が世界中で白熱した議論を巻き起こした - 「覇権条項」に署名した従業員が次々と暴露 - ネットユーザーがウルトラマンの「」をリストアップ噂の払拭: Vox が入手した漏洩情報と文書によると、アルトマンを含む OpenAI の上級幹部はこれらの株式回収条項をよく認識しており、承認しました。さらに、OpenAI には、AI セキュリティという深刻かつ緊急の課題が直面しています。最近、最も著名な従業員2名を含むセキュリティ関連従業員5名が退職し、「Super Alignment」チームが解散したことで、OpenAIのセキュリティ問題が再び注目を集めている。フォーチュン誌は OpenA を報じた。

See all articles