1. 程式人生 > >發現Oracle11.2.0.1關於NLS_LENGTH_SEMANTICS的一個Bug

發現Oracle11.2.0.1關於NLS_LENGTH_SEMANTICS的一個Bug

這段時間在做資料遷移,需要從10g的ZHS16GBK字符集的資料庫裡面遷移資料到11g的UTF8字元的資料庫,並且源資料庫的NLS_LENGTH_SEMANTICS引數值為Byte,目標端的NLS_LENGTH_SEMANTICS引數值為CHAR。如果直接從源使用exp/expdp匯出資料,然後使用imp/impdp匯入資料到目標的話,可能會出現資料超長的情況,這時候就不好搞了,因此我就使用了中轉的方式。即,把源資料匯入到NLS_LENGTH_SEMANTICS引數值為CHAR的ZHS16GBK字符集的中轉資料庫中,然後再從中轉資料庫中匯出資料並匯入到目標資料庫中。

:這樣做是有條件的,源資料庫中沒有長度超過4000/3箇中文字元的CHAR/VARCHAR2欄位,原因

看這裡

繼續這個問題,之所以這麼做,目的是為了在資料部超長的情況得到CHAR/VARCHAR2型別欄位以CHAR儲存的資料。

根據Oracle的定義,NLS_LENGTH_SEMANTICS引數可以在三個層次生效:資料庫級、例項級、會話級,並且生效的優先順序為會話級>例項級>資料庫級。

但是,我發現了一個問題:不管把NLS_LENGTH_SEMANTICS在那個級別設定為CHAR,在Oracle 11.2.0.1中,新匯入表都不會使用CHAR做為CHAR/VARCHAR2等資料型別的儲存單位,而是一律使用預設的Byte,除非源資料就已經指定了CHAR。

請看如下實驗過程,全過程均使用普通使用者,因為NLS_LENGTH_SEMANTICS引數對sys使用者無效:


先檢視NLS_LENGTH_SEMANTICS引數,Database、Instance和Session都設定為CHAR
[email protected]> select * from nls_session_parameters where PARAMETER='NLS_LENGTH_SEMANTICS';

PARAMETER                      VALUE
------------------------------ --------------------------------------------------
NLS_LENGTH_SEMANTICS           CHAR


[email protected]> select * from nls_instance_parameters where PARAMETER='NLS_LENGTH_SEMANTICS';

PARAMETER                      VALUE
------------------------------ --------------------------------------------------
NLS_LENGTH_SEMANTICS           CHAR
[email protected]> select * from nls_database_parameters where PARAMETER='NLS_LENGTH_SEMANTICS';

PARAMETER                      VALUE
------------------------------ --------------------------------------------------
NLS_LENGTH_SEMANTICS           CHAR

然後倒入資料

[[email protected] dumpdp]$ impdp vip/vip directory=dumpdir dumpfile=vip.byte.dat logfile=$ORACLE_SID.vip.impdp.`date +'%Y%m%d%H%M%S'`.log

Import: Release 11.2.0.1.0 - Production on Wed Mar 7 16:21:03 2012

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options
Master table "VIP"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "VIP"."SYS_IMPORT_FULL_01":  vip/******** directory=dumpdir dumpfile=vip.byte.dat logfile=srcbdb.vip.impdp.20120307162103.log
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/DB_LINK
ORA-31685: Object type DB_LINK:"VIP"."DB_SRCBDATA" failed due to insufficient privileges. Failing sql is:
CREATE DATABASE LINK "DB_SRCBDATA"  CONNECT TO "SRCBDATA" IDENTIFIED BY VALUES '053E86648883623A93807EAD3C7A2EA776FA8F916A941AFB2E'  USING 'srcbfin'
 
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Job "VIP"."SYS_IMPORT_FULL_01" completed with 1 error(s) at 16:24:48

查看錶結構
[[email protected] dumpdp]$ sqlplus vip/vip

SQL*Plus: Release 11.2.0.1.0 Production on Wed Mar 7 14:56:04 2012

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining
and Real Application Testing options

[email protected]> select * from tab where rownum <10;

TNAME                                                        TABTYPE         CLUSTERID
------------------------------------------------------------ -------------- ----------
DISCARD_TBDSCLIENT                                           TABLE
IT_AJDK                                                      TABLE
IT_DSDK                                                      TABLE
IT_DSDQCK                                                    TABLE
IT_DSHQCK                                                    TABLE
IT_DSKH                                                      TABLE
SNAPTBEXCHANGERATE                                           TABLE
TBADVICELOG                                                  TABLE
TBADVICELOGSETMEAL                                           TABLE

9 rows selected.

[email protected]> desc SNAPTBEXCHANGERATE
 Name                                                                                                              Null?    Type
 ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
 MONEY_TYPE                                                                                                          VARCHAR2(3)                      <--------------   這說明表是以Byte儲存VARCHAR2資料型別的。
 TO_RMB_RATE                                                                                                         NUMBER(15,7)
 TO_USD_RATE                                                                                                         NUMBER(15,7)

我們再新建一個表看一下,注意,不顯示指定CHAR或者Byte,資料使用預設值!

[email protected]> create table lzb (col1 char(10),col2 varchar2(10));

Table created.

[email protected]> desc lzb
 Name                                                                                                              Null?    Type
 ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
 COL1                                                                                                                CHAR(10 CHAR)                   <--------------   這時候發現已經自動使用了CHAR。
 COL2                                                                                                                VARCHAR2(10 CHAR)

結論:在11.2.0.1裡面,對於使用imp/impdp工具匯入的資料,nls_length_semantics不生效!

我不知道這是不是Oracle的Bug,看官也可以幫我求證一下!!!!

【附錄:MOS上的文章】


相關推薦

發現Oracle11.2.0.1關於NLS_LENGTH_SEMANTICS的一個Bug

這段時間在做資料遷移,需要從10g的ZHS16GBK字符集的資料庫裡面遷移資料到11g的UTF8字元的資料庫,並且源資料庫的NLS_LENGTH_SEMANTICS引數值為Byte,目標端的NLS_LENGTH_SEMANTICS引數值為CHAR。如果直接從源使用exp/e

今天發現了Vczh Free Script 2.0一個bug

    今天抓到了一個隱藏了3個月的bug。這個bug以前一直沒有被找到,因為以前寫的用於測試指令碼的程式碼都沒有出現類成員函式使用非全域性的外部物件的情況。Vampire.Kiss用我的Vczh Free Script 2.0代替PHP開發了一個網站,過程中也向我提了不少要求。其中有一個就是想在

Oracle11.2.0.4升級170418PATCH後login.sql無法使用

oracle sqlplus login.sql最近生產上的數據庫升級到了11.2.0.4當前最新的PATCH——170418,但是在使用sqlplus登錄數據庫進行操作時,發現與以往登錄時不同的地方。打PATCH以前登錄時的截圖:打PATCH之後 登錄時的截圖:從截圖上直觀看到的是登錄時的信息沒有顯示出來

在Centos6.9上安裝oracle11.2.0.4

blog 轉載 感謝 刪除數據 net 工具 clas 創建 sha 本文內容的來源包含並不限於如下幾位數據庫大神的視頻課堂或博客,由本人或原文轉載、或二次整理,在此由衷感謝! 小麥苗博客:http://blog.itpub.net/26736162/ 風哥博客:http:

oracle11.2.0.4 rac asm啟動故障

數據庫 Oracle 現場人員反映一套庫啟動失敗,集群資源啟動失敗,發截圖和日誌過來分析 分析日誌後發現: ASM沒有啟動 OCR等不能啟動 問題1: 2018-05-08 11:59:39.980: [? OCRASM][1639659296]proprasmo: Error in open/cr

Yii 2.0開發一個仿京東商城平臺

PHP第1章 課程簡介 介紹了課程內容、背景和案例展示。第2章 項目的準備工作介紹了如何使用PHP依賴管理工具Composer安裝Yii2框架,模擬配置真實企業開發項目運行環境和編輯器。第3章 項目前臺頁面的搭建介紹了如何使用Yii2框架的頁面布局管理完成前臺首頁、商品分類、商品詳情、購物車、收銀臺、訂

Oracle11.2.0.4-Rac集群hang分析記錄

RAC Hang1、情況概述:早上公司一個業務系統zabbix告警沒正常同步數據,經過排查日誌有connect reset情況:2、問題分析經過排查分析網絡,系統資源,數據庫系統資源,awr報告並未發現明細異常。然後排查節點是否hang住的分析:oradebug hanganalyze 3 3、oracle官

發現一個騙粉絲的人後發現博客園的一個bug

說明 image rdquo 互聯網 主頁 參數 互聯 git ogg 發現一個騙粉絲的人後發現博客園的一個bug 當你點開這篇文章的時候,如果你已經登錄博客園賬號,那麽你自動回成為我的博客園粉絲,因為我加了自動關註的js,這裏並不是想騙粉絲,希望博客園能重視這個bug(

OracleLinux6.5下Oracle11.2.0.4的安裝

following 升級 打開終端 alt min oinstall 路徑 product 設置環境變量 接http://blog.51cto.com/12784425/2310379此文1、準備工作Oracle11.2.0.4的安裝包;VNC客戶端vnc Viewer;

oracle11.2.0.1.0 連線 python3.5.1

1.    cx_Oracle:cx_Oracle-6.0rc2-cp35-cp35m-win_amd64.whl        下載網址:https://pypi.python.org/pypi/cx_Oracle/5.3 2.

ORACLE11.2.0 SQLPLUS 報 error while loading shared libraries

對應的環境平臺: OS: Linux TEST11G 2.6.18-8.el5 #1 SMP Fri Jan 26 14:15:21 EST 2007 i686 i686 i386 GNU/Linux DB Oracle Database 11g Enterprise Ed

Oracle11.2.0.1.0節點1叢集不能正常啟動,報CRS-4535,CRS-4530

2014-07-18 17:17:58.018: [GIPCXCPT][2517008128]gipcmodGipcPassInitializeNetwork: failed to find any interfaces in clsinet, ret gipcretFail (1) 2014-07-18 1

Oracle11.2.0非安裝版(簡裝版)製作完成(僅供開發人員參考使用)

作者: [email protected], 2012.3.11. 請尊重個人勞動。如若轉載,請註明原始出處。Thanks.下載地址:[url]http://download.csdn.net/detail/iihero/4131001[/url](免責宣告): 這

Oracle11.2.0.1.0叢集資料庫不能正常啟動,報ORA-01078,ORA-01565,ORA-17503,ORA-12547錯誤

[[email protected] ~]$ crs_stat -t Name           Type           Target    State     Host         ----------------------------------------------------

Java JDBC連線Oracle11.2.0.2(Eclipse)

1.下載OracleJDBC驅動。(Oracle11.2.0.2)或者在ORACLE_HOME/jdbc/lib下獲取JDBC驅動2.匯入OracleJDBC驅動Eclipse: Build Path->Libraries->Add External JARs…-

oracle11.2.0.1靜默安裝之dbca靜默建庫

1) 生成響應檔案:[[email protected] response]$ cp netca.rsp ../netca.rsp^C[[email protected] response]$ pwd/home/oracle/database/respon

傳輸資料庫升級Oracle11.2.0.3到Oracle12.2

最近在找一些方法升級Oracle到12.2,怎樣才能停機時間短,普通的升級方式,我感覺很漫長。看了官方文件,發現了一個停機時間短的方法,利用傳輸資料庫的方式升級資料庫,能看到我的實驗,匯入時間是9分鐘,整體停機時間是15分鐘不到。我覺得可以接受了。 大致原理是:知道傳輸

WIN ORACLE11.2.0.4打最新補丁的方法

背景:安全掃描,掃出很多ORACLE漏洞,按照領導安排對11G資料庫進行補丁升級。完成思路:1、 利用metalink下載針對版本的補丁2、 Opatch工具安裝補丁11.2.0.4實施:(1)拷貝以下補丁檔案到對應伺服器,並解壓。(2)將oracle_home下的opatc

解讀OpenGL ES 2.0繪製一個三角形的步驟

前言:         從上一篇文章中,我們在win7下面搭建OpenGL ES 2.0開發環境的時候,成功運行了官方程式設計指導中提供的Hello_Triangle這個例子,最後得到的結果就是在視窗中繪製出一個紅色的三角形,接下來我們就開始來解讀這個demo的程式碼和實現

oracle11.2.0.1網絡基礎結構配置失敗

文件 沒有 system32 安裝oracle ces sts sha 技術分享 sys 安裝oracle rac,預檢查沒有問題,在安裝進行到100後,總是提示網格基礎結構失敗,原因為“插件的執行方法失敗”,反復嘗試,最後發現是hosts配置問題, 解決辦法:修改HOS