Oracle基本数据类型存储格式浅析(一)字符类型
主要说明字符类型的存储式。主要包括char、varchar2和long等几种类型。 1 实验(数字,英文字母) 1.1 建表 SQL create table test_char(char_col char(10), varchar_col varchar2(10), long_col long) tablespace assm; Table created SQL insert into test
主要说明字符类型的存储格式。主要包括char、varchar2和long等几种类型。1 实验(数字,英文字母)
1.1 建表
SQL> create table test_char(char_col char(10), varchar_col varchar2(10), long_col long) tablespace assm;
Table created
SQL> insert into test_char values ('abc', '123', ',fd');
1 row inserted
SQL> commit;
Commit complete
SQL> select a.*,
2 rowid,
3 dbms_rowid.rowid_object(rowid) obj#,
4 dbms_rowid.rowid_relative_fno(rowid) file#,
5 dbms_rowid.rowid_block_number(rowid) block#,
6 dbms_rowid.rowid_row_number(rowid) row#
7 from test_char a;
CHAR_COL VARCHAR_COL LONG_COL ROWID OBJ# FILE# BLOCK# ROW#
---------- ----------- ------------ ------------------ ---------- ---------- ---------- ----------
abc 123 ,fd AAANCkAAHAAAACYAAA 53412 7 152 0
1.2 dump block
FILE#为7,BLOCK#为152。
SQL> alter system dump datafile 7 block 152;
System altered
SQL> select p.spid
2 from v$session s, v$process p, v$mystat m
3 where s.paddr = p.addr
4 and s.sid = m.sid
5 and rownum = 1;
SPID
-----------
18108
1.3 查看trace文件
根据SPID找到trace文件。
……
block_row_dump:
tab 0, row 0, @0x1f82
tl: 22 fb: --H-FL-- lb: 0x1 cc: 3
col 0: [10] 61 62 63 20 20 20 20 20 20 20
col 1: [ 3] 31 32 33
col 2: [ 3] 2c 66 64
end_of_block_dump
1.4 结论分析
观察dump出来的结果,可以发现以下几点:
1.对于每个字段,除了保存字段的值以外,还会保存当前字段中数据的长度。而且,oracle显然没有把字段的长度定义或类型定义保存在block中,这些信息保存在oracle的数据字典里面。
2.根据dump的结果,可以清楚的看到,字符类型在数据库中是以Ascii格式存储的。
SQL> select chr(to_number('61', 'xx')) from dual;
CHR(TO_NUMBER('61','XX'))
-------------------------
a
SQL> select dump(char_col, 16) d_char from test_char;
D_CHAR
--------------------------------------------------------------------------------
Typ=96 Len=10: 61,62,63,20,20,20,20,20,20,20
SQL> select dump(varchar_col, 16) d_varchar2 from test_char;
D_VARCHAR2
--------------------------------------------------------------------------------
Typ=1 Len=3: 31,32,33
SQL> select dump(long_col, 16) d_varchar2 from test_char;
select dump(long_col, 16) d_varchar2 from test_char
ORA-00997: illegal use of LONG datatype
由于DUMP 不支持LONG类型,因此我们使用了alter system dump block的方式,通过比较两种方式得到的结果,发现DUMP()函数不但方便,结果清晰,而且指出了进行DUMP的数据类型,在以后的例子中,除非必要 的情况,否则都会采用DUMP()函数的方式进行说明。
2 实验(中文)
2.1 中文
SQL> select a.name, a.value$ from sys.props$ a where a.name like '%CHARACTERSET%';
NAME VALUE$
------------------------------ ----------------
NLS_CHARACTERSET ZHS16GBK
NLS_NCHAR_CHARACTERSET AL16UTF16
SQL> insert into test_char values ('定长', '变长', null);
1 row inserted
SQL> commit;
Commit complete
SQL> select dump(char_col, 16) d_char from test_char;
D_CHAR
--------------------------------------------------------------------------------
Typ=96 Len=10: 61,62,63,20,20,20,20,20,20,20
Typ=96 Len=10: b6,a8,b3,a4,20,20,20,20,20,20
SQL> select dump(varchar_col, 16) d_varchar2 from test_char;
D_VARCHAR2
--------------------------------------------------------------------------------
Typ=1 Len=3: 31,32,33
Typ=1 Len=4: b1,e4,b3,a4
根据dump结果,可以清楚的看出,普通英文字符和标点用一个字节表示,而中文字符或中文标点需要两个字节来表示。
2.2 nchar与nvarchar2
SQL> create table test_nchar(nchar_col nchar(10), nvarchar_col nvarchar2(10));
Table created
SQL> insert into test_nchar values('nchar定长', 'nvarchar变长');
1 row inserted
SQL> commit;
Commit complete
SQL> select dump(nchar_col, 16) from test_nchar;
DUMP(NCHAR_COL,16)
--------------------------------------------------------------------------------
Typ=96 Len=20: 0,6e,0,63,0,68,0,61,0,72,5b,9a,95,7f,0,20,0,20,0,20
SQL> select dump(nvarchar_col, 16) from test_nchar;
DUMP(NVARCHAR_COL,16)
--------------------------------------------------------------------------------
Typ=1 Len=20: 0,6e,0,76,0,61,0,72,0,63,0,68,0,61,0,72,53,d8,95,7f
采用nchar,nvarchar2虽然仍然是采用Ascii码存储,但是nchar使用的AL16UTF16字符集,编码长度变为2个字节。这样中文使用两个字节,对于可以用一个字节就表示的英文字符,采用了高位补0的方式凑足2位,这样,对于采用AL16UTF16字符集的nchar类型,无论中文还是英文都用2位字符表示。
转贴:http://www.itpub.net/forum.php?mod=viewthread&tid=308317

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Oracle 打不開的解決辦法包括:1. 啟動數據庫服務;2. 啟動監聽器;3. 檢查端口衝突;4. 正確設置環境變量;5. 確保防火牆或防病毒軟件未阻止連接;6. 檢查服務器是否已關閉;7. 使用 RMAN 恢復損壞的文件;8. 檢查 TNS 服務名稱是否正確;9. 檢查網絡連接;10. 重新安裝 Oracle 軟件。

解決 Oracle 游標關閉問題的方法包括:使用 CLOSE 語句顯式關閉游標。在 FOR UPDATE 子句中聲明游標,使其在作用域結束後自動關閉。在 USING 子句中聲明游標,使其在關聯的 PL/SQL 變量關閉時自動關閉。使用異常處理確保在任何異常情況下關閉游標。使用連接池自動關閉游標。禁用自動提交,延遲游標關閉。

Oracle 中,FOR LOOP 循環可動態創建游標, 步驟為:1. 定義游標類型;2. 創建循環;3. 動態創建游標;4. 執行游標;5. 關閉游標。示例:可循環創建游標,顯示前 10 名員工姓名和工資。

Oracle 日誌文件寫滿時,可採用以下解決方案:1)清理舊日誌文件;2)增加日誌文件大小;3)增加日誌文件組;4)設置自動日誌管理;5)重新初始化數據庫。在實施任何解決方案前,建議備份數據庫以防數據丟失。

Oracle不僅是數據庫公司,還是雲計算和ERP系統的領導者。 1.Oracle提供從數據庫到雲服務和ERP系統的全面解決方案。 2.OracleCloud挑戰AWS和Azure,提供IaaS、PaaS和SaaS服務。 3.Oracle的ERP系統如E-BusinessSuite和FusionApplications幫助企業優化運營。

在CentOS系統上搭建Hadoop分佈式文件系統(HDFS)需要多個步驟,本文提供一個簡要的配置指南。一、前期準備安裝JDK:在所有節點上安裝JavaDevelopmentKit(JDK),版本需與Hadoop兼容。可從Oracle官網下載安裝包。環境變量配置:編輯/etc/profile文件,設置Java和Hadoop的環境變量,使系統能夠找到JDK和Hadoop的安裝路徑。二、安全配置:SSH免密登錄生成SSH密鑰:在每個節點上使用ssh-keygen命令

要停止 Oracle 數據庫,請執行以下步驟:1. 連接到數據庫;2. 優雅關機數據庫(shutdown immediate);3. 完全關機數據庫(shutdown abort)。

可以通過使用 Oracle 的動態 SQL 來根據運行時輸入創建和執行 SQL 語句。步驟包括:準備一個空字符串變量來存儲動態生成的 SQL 語句。使用 EXECUTE IMMEDIATE 或 PREPARE 語句編譯和執行動態 SQL 語句。使用 bind 變量傳遞用戶輸入或其他動態值給動態 SQL。使用 EXECUTE IMMEDIATE 或 EXECUTE 執行動態 SQL 語句。
