[20171220]toad plsql顯示整形的bug.txt

来源:http://www.cnblogs.com/lfree/archive/2017/12/21/8078501.html
-Advertisement-
Play Games

[20171220]toad plsql顯示整形的bug.txt--//下午有itpub網友反應,一個查詢在sqlplus,pl/sql下不同.鏈接如下:--//http://www.itpub.net/thread-2095697-1-1.html--//我測試感覺是數據出現錯誤.直接那它的數據測 ...


[20171220]toad plsql顯示整形的bug.txt

--//下午有itpub網友反應,一個查詢在sqlplus,pl/sql下不同.鏈接如下:
--//http://www.itpub.net/thread-2095697-1-1.html
--//我測試感覺是數據出現錯誤.直接那它的數據測試看看.

1.環境:
SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> create table t ( id number , a  number(15,2));
Table created.

insert into t values (1,7334.00);
insert into t values (2,7334.00);
commit ;

SCOTT@book> select rowid,t.*,dump(a,16) c30  from t;
ROWID                      ID          A C30
------------------ ---------- ---------- ------------------------------
AAAWLoAAEAAAAIkAAA          1       7334 Typ=2 Len=3: c2,4a,23
AAAWLoAAEAAAAIkAAB          2       7334 Typ=2 Len=3: c2,4a,23

--//正常7334的編碼就是c24a23

SCOTT@book> @ &r/conv_n c24a23
old   1: select utl_raw.cast_to_number(lower('&1')) n20 from dual
new   1: select utl_raw.cast_to_number(lower('c24a23')) n20 from dual
       N20
----------
      7334

--//而對方看到的編碼是c248eb,明顯不對.
SCOTT@book> @ &r/conv_n c248eb
old   1: select utl_raw.cast_to_number(lower('&1')) n20 from dual
new   1: select utl_raw.cast_to_number(lower('c248eb')) n20 from dual
select utl_raw.cast_to_number(lower('c248eb')) n20 from dual
       *
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at "SYS.UTL_RAW", line 388

SCOTT@book> @ &r/rowid AAAWLoAAEAAAAIkAAA
    OBJECT       FILE      BLOCK        ROW ROWID_DBA            DBA                  TEXT
---------- ---------- ---------- ---------- -------------------- -------------------- ----------------------------------------
     90856          4        548          0  0x1000224           4,548                alter system dump datafile 4 block 548 ;

SCOTT@book> alter system checkpoint;
System altered.

SCOTT@book> alter system flush BUFFER_CACHE;
System altered.

2.通過bbed修改數據塊:
SCOTT@book> @ &r/bbvi  4        548
BVI_COMMAND
-----------------------------------------------------
bvi -b 4489216 -s 8192 /mnt/ramdisk/book/users01.dbf

--//執行如上命令,修改數據塊其中一條記錄編碼 c24a23 => c248eb.
$ bvi -b 4489216 -s 8192 /mnt/ramdisk/book/users01.dbf
..
00449FB0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00449FC0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00449FD0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00449FE0  00 00 00 00 00 00 00 00 2C 02 02 02 C1 03 03 C2 ........,.......
00449FF0  4A 23 2C 01 02 02 C1 02 03 C2 48 EB 02 06 31 3B J#,.......H...1;
                                     ~~~~~~~~
0044A000

--//下劃線處就是修改後內容.註意要在bbed下執行sum apply更新檢查和.

BBED> set dba 4,548
        DBA             0x01000224 (16777764 4,548)

BBED> sum apply
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
Check value for File 4, Block 548:
current = 0xd0bc, required = 0xd0bc

3.通過sqlplus查詢:
SCOTT@book> select rowid,t.*,dump(a,16) c30  from t;
ROWID                      ID          A C30
------------------ ---------- ---------- ------------------------------
AAAWLoAAEAAAAIkAAA          1            Typ=2 Len=3: c2,48,eb
AAAWLoAAEAAAAIkAAB          2       7334 Typ=2 Len=3: c2,4a,23


--//在toad下執行:
set linesize 160
column c30 format a30
select rowid,t.*,dump(a,16) c30  from t;

--//選擇execute as script按鈕,結果如下:

ROWID                      ID          A C30
------------------ ---------- ---------- ------------------------------
AAAWLoAAEAAAAIkAAA          1       7334 Typ=2 Len=3: c2,48,eb
AAAWLoAAEAAAAIkAAB          2       7334 Typ=2 Len=3: c2,4a,23
2 rows selected.

--//很明顯toad顯示出了問題.7334的整形編碼是c2,4a,23. pl/sql也一樣不再測試.
--//為什麼呢?
0x4a=74
0x23=35

--//oracle採用百位進位,為了避開0 ,使用+1表示.這樣74=>73,35=>34 ,這樣表示7334無疑是正確的.

48=72
eb=235

--//我的理解或者(亂猜): 235= 2*100+35, 相當於 前面變成72+2=74 => 減少1對應73,剩下35 減少1,對應34,這樣解析為7334
--//按照道理toad工具不大可能解析整形,只能是相關的驅動出了問題.純粹亂猜,那位知道.

4.可以修改id=2的記錄:
--//135=0x87,如果修改c2 49 87 應該對應的整形也是7334,看看是否正確.

SCOTT@book> alter system flush BUFFER_CACHE;
System altered.

SCOTT@book> alter system checkpoint;
System altered.

$ bvi -b 4489216 -s 8192 /mnt/ramdisk/book/users01.dbf
..
00449F80  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00449F90  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00449FA0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00449FB0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00449FC0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00449FD0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00449FE0  00 00 00 00 00 00 00 00 2C 02 02 02 C1 03 03 C2 ........,.......
00449FF0  49 87 2C 01 02 02 C1 02 03 C2 48 EB 01 06 31 3B I.,.......H...1;
          ~~~~~                      ~~~~~~~~
0044A000

--//下劃線處就是修改後內容.註意要在bbed下執行sum apply更新檢查和.

--//sqlplus 下查詢:

SCOTT@book> select rowid,t.*,dump(a,16) c30  from t;

ROWID                      ID          A C30
------------------ ---------- ---------- ------------------------------
AAAWLoAAEAAAAIkAAA          1            Typ=2 Len=3: c2,48,eb
AAAWLoAAEAAAAIkAAB          2            Typ=2 Len=3: c2,49,87


--//在toad下執行:
set linesize 160
column c30 format a30
select rowid,t.*,dump(a,16) c30  from t;

ROWID                      ID          A C30                           
------------------ ---------- ---------- ------------------------------
AAAWLoAAEAAAAIkAAA          1       7334 Typ=2 Len=3: c2,48,eb         
AAAWLoAAEAAAAIkAAB          2       7334 Typ=2 Len=3: c2,49,87         
2 rows selected.

--//這樣也驗證我的判斷.
--//我在測試中遇到出現壞塊的情況(也許忘記sum apply),我的dg自動修複了壞塊,我停止dg.再重覆就演示相似的情況.

--//我在9.2.0.8 ,10.2.0.4 做了一點測試:
--//我在10g下查詢:
SCOTT@test> @ &r/conv_n c248eb
new   1: select utl_raw.cast_to_number(lower('c248eb')) n20 from dual
       N20
----------
      71bc

--//它能執行,11g報錯.

--//在9.2.0.8下:
08:20:57 sys@XXT1> select utl_raw.cast_to_number(lower('c248eb')) n20 from dual;

       N20
----------
      71`@
--//也能執行.

--//到底人為修改還是那個程式能錄入這樣效果,就不知道了.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • #!/usr/bin/expect -f set pwffd [lindex $argv 0] spawn ssh cmesvr2i expect "*password:" send "$pwffd\r" expect "*#" interact ...
  • 二周第三次課(12月20日)2.14 更改文件和目錄許可權chmod 2.15 更改所有者和所屬組chown2.16 umask2.17 隱藏許可權lsattr/chattr 更改文件和目錄許可權:命令:#chmod >> change mode (-R=文件所有者·文件所屬組·其他用戶一起更改) # r ...
  • Linux下一次刪除百萬文件 Linux下一次刪除百萬文件 線上環境遇到的一個問題,文件數量過多,執行rm命令報錯 # rm -f ./* -bash: /bin/rm: Argument list too long # rm -f ./* -bash: /bin/rm: Argument list ...
  • 一、heartbeat介紹 heartbeat是HA高可用集群的一個重要組件,heartbeat實現了資源轉移和心跳信息傳遞。它的常用組合方式為heartbeat v1,heartbeat v2+crm,heartbeat v3 + pacemaker,目前版本為v3版本。 二、編譯前準備 hear ...
  • 一、LVS基本情況 lvs:Linux Virtual Server,是一種負載均衡集群,其主要是由工作在內核的ipvs與用戶空間的命令行工具ipvsadm組成。支持TCP,UDP,AH,EST,AH_EST,SCTP等諸多協議。 lvs-type: lvs-nat ​ lvs-dr(direct ...
  • 一、systemd的由來與特性 1、歷史由來 從CentOS 7系列開始,redhat正式將systemd用於系統管理,來取代CentOS 5的sysV init和CentOS 6的upstart體系;較之之前,systemd為linux系統提供了啟動與管理的一整套解決方案;下圖為systemd框架 ...
  • 【簡介】 fsck命令被用於檢查並且試圖修複文件系統中的錯誤。當文件系統發生錯誤四化,可用fsck指令嘗試加以修複。【選項】必要參數 -a 非互交模式,自動修複 -c 檢查是否存在有損壞的區塊。 -C<反敘述器> fsck.ext3命令會把全部的執行過程,都交由其逆向敘述,便於監控程式 -d 詳細顯 ...
  • SSH 為 SecureShell 的縮寫,由 IETF 的網路工作小組(NetworkWorkingGroup)所制定;SSH 是一種安全協議,主要用於給遠程登錄會話數據進行加密,保證數據傳輸的安全。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...