电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Oracle基本數據類型存儲格式淺析:字符類型

瀏覽:3日期:2023-11-20 11:17:39
前一陣看完文檔,對Oracle的基本數據類型的存儲格式有了一些了解,最近有做了一些測試進行了驗證。打算整理總結一下,這一篇主要說明字符類型的存儲格式。主要包括char、varchar2和long等幾種類型。SQL> create table test_char (char_col char(10), varchar_col varchar2(10), long_col long);表已創建。SQL> insert into test_char values ('abc', '123', ',fd');已創建 1 行。SQL> commit;提交完成。SQL> select rowid from test_char;ROWID------------------AAAB3LAAFAAAAAgAAA根據rowid的定義規則,第7~9位是表示的是數據文件,F表示5,而10~15位表示的是在這個數據文件中的第幾個BLOCK,g表示32。(rowid編碼相當于64進制。用A~Z a~z 0~9 + /共64個字符表示。A表示0,B表示1,……,a表示26,……,0表示52,……,+表示62,/表示63。)我們根據計算的結果去dump這個block。SQL> ALTER SYSTEM DUMP DATAFILE 5 BLOCK 32;系統已更改。打開產生的trace文件:data_block_dump,data header at 0x3421064===============tsiz: 0x1f98hsiz: 0x14pbl: 0x03421064bdba: 0x01400020 76543210flag=--------ntab=1nrow=1frre=-1fsbo=0x14fseo=0x1f82avsp=0x1f6etosp=0x1f6e0xe:pti[0] nrow=1 offs=00x12:pri[0] offs=0x1f82block_row_dump:tab 0, row 0, @0x1f82tl: 22 fb: --H-FL-- lb: 0x1; cc: 3col; 0: [10]; 61 62 63 20 20 20 20 20 20 20col; 1: [ 3]; 31 32 33col; 2: [ 3]; 2c 66 64end_of_block_dumpEnd dump data blocks tsn: 5 file#: 5 minblk 32 maxblk 32觀察dump出來的結果,可以發現以下幾點:1.對于每個字段,除了保存字段的值以外,還會保存當前字段中數據的長度。而且,oracle顯然沒有把字段的長度定義或類型定義保存在block中,這些信息保存在oracle的數據字典里面。2. 根據dump的結果,可以清楚的看到,字符類型在數據庫中是以ascii格式存儲的。SQL> select chr(to_number('61', 'xx')) from dual;CH--a3.char類型為定長格式,存儲的時候會在字符串后面填補空格,而varchar2和long類型都是變長的。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,20SQL> SELECT DUMP(VARCHAR_COL, 16) D_VARCHAR2 FROM TEST_CHAR;D_VARCHAR2-------------------------------------------------------------Typ=1 Len=3: 31,32,33SQL> SELECT DUMP(LONG_COL, 16) D_VARCHAR2 FROM TEST_CHAR;SELECT DUMP(LONG_COL, 16) D_VARCHAR2 FROM TEST_CHAR *ERROR 位于第 1 行:ORA-00997: 非法使用 LONG 數據類型由于DUMP不支持LONG類型,因此我們使用了alter system dump block的方式,通過比較兩種方式得到的結果,發現DUMP()函數不但方便,結果清楚,而且指出了進行DUMP的數據類型,在以后的例子中,除非必要的情況,否則都會采用DUMP()函數的方式進行說明。下面看一下插入中文的情況,首先看一下數據庫的字符集SQL> select name, value$ from sys.props$ where name like '%CHARACTERSET%';NAMEVALUE$ ------------------------------ ------------------------------NLS_CHARACTERSET;;;;ZHS16GBKNLS_NCHAR_CHARACTERSET AL16UTF16SQL> insert into test_char values ('定長', '變長', null);已創建 1 行。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,20Typ=96 Len=10: b6,a8,b3,a4,20,20,20,20,20,20SQL> SELECT DUMP(VARCHAR_COL, 16) D_VARCHAR2 FROM TEST_CHAR;D_VARCHAR2----------------------------------------------------------------Typ=1 Len=3: 31,32,33Typ=1 Len=4: b1,e4,b3,a4根據dump結果,可以清楚的看出,普通英文字符和標點用一個字節表示,而中文字符或中文標點需要兩個字節來表示。下面,對比一下nchar和nvarchar2與char、varchar2類型有什么不同。SQL> create table test_nchar (nchar_col nchar(10), nvarchar_col nvarchar2(10));表已創建。SQL> insert into test_nchar values ('nchar定長', 'nvarchar變長');已創建 1 行。從這里已經可以看出一些不同了,假如按照剛才中文的計算方法,'nvarchar變長'的長度是8+2*2=12已經超過了數據類型定義的大小,可是為什么插入成功了?還是dump一下看看結果吧。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,20SQL> 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這下就明白了,雖然仍然是采用ascii碼存儲,但是nchar使用的AL16UTF16字符集,編碼長度變為2個字節。這樣中文使用兩個字節,對于可以用一個字節就表示的英文字符,采用了高位補0的方式湊足2位,這樣,對于采用AL16UTF16字符集的nchar類型,無論中文還是英文都用2位字符表示。因此'nvarchar變長'的長度是10,并沒有超過數據類型的限制。
標簽: Oracle 數據庫
主站蜘蛛池模板: 深圳市索富通实业有限公司-可燃气体报警器 | 可燃气体探测器 | 气体检测仪 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 青岛侦探调查_青岛侦探事务所_青岛调查事务所_青岛婚外情取证-青岛狄仁杰国际侦探公司 | 浙江清风侠环保设备有限公司 | 净水器代理,净水器招商,净水器加盟-FineSky德国法兹全屋净水 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 创客匠人-让IP变现不走弯路 | 工业PH计|工业ph酸度计|在线PH计价格-合肥卓尔仪器仪表有限公司 济南画室培训-美术高考培训-山东艺霖艺术培训画室 | 南京蜂窝纸箱_南京木托盘_南京纸托盘-南京博恒包装有限公司 | 【直乐】河北石家庄脊柱侧弯医院_治疗椎间盘突出哪家医院好_骨科脊柱外科专业医院_治疗抽动症/关节病骨伤权威医院|排行-直乐矫形中医医院 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 幂简集成 - 品种超全的API接口平台, 一站搜索、试用、集成国内外API接口 | 车件|铜件|车削件|车床加工|五金冲压件-PIN针,精密车件定制专业厂商【东莞品晔】 | 土壤水分自动监测站-SM150便携式土壤水分仪-铭奥仪器 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | HYDAC过滤器,HYDAC滤芯,现货ATOS油泵,ATOS比例阀-东莞市广联自动化科技有限公司 | 艺术生文化课培训|艺术生文化课辅导冲刺-济南启迪学校 | 折弯机-刨槽机-数控折弯机-数控刨槽机-数控折弯机厂家-深圳豐科机械有限公司 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 长沙印刷厂-包装印刷-画册印刷厂家-湖南省日大彩色印务有限公司 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | app开发|app开发公司|小程序开发|物联网开发||北京网站制作|--前潮网络 | 酒糟烘干机-豆渣烘干机-薯渣烘干机-糟渣烘干设备厂家-焦作市真节能环保设备科技有限公司 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 首页-恒温恒湿试验箱_恒温恒湿箱_高低温试验箱_高低温交变湿热试验箱_苏州正合 | 玖容气动液压设备有限公司-气液增压缸_压力机_增压机_铆接机_增压器 | 【官网】博莱特空压机,永磁变频空压机,螺杆空压机-欧能优 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 苏州注册公司_苏州代理记账_苏州工商注册_苏州代办公司-恒佳财税 | 上海阳光泵业制造有限公司 -【官方网站】 | 筛分机|振动筛分机|气流筛分机|筛分机厂家-新乡市大汉振动机械有限公司 | 真空干燥烘箱_鼓风干燥箱 _高低温恒温恒湿试验箱_光照二氧化碳恒温培养箱-上海航佩仪器 | 行星齿轮减速机,减速机厂家,山东减速机-淄博兴江机械制造 | Copeland/谷轮压缩机,谷轮半封闭压缩机,谷轮涡旋压缩机,型号规格,技术参数,尺寸图片,价格经销商 CTP磁天平|小电容测量仪|阴阳极极化_双液系沸点测定仪|dsj电渗实验装置-南京桑力电子设备厂 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 大型果蔬切片机-水果冬瓜削皮机-洗菜机切菜机-肇庆市凤翔餐饮设备有限公司 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 |