聯機重定義修改欄位型別(NVARCHAR2->VARCHAR2)
SQL類似如下:
SELECT * FROM T1,T2 WHERE T1.NAME=T2.NAME AND T1.NAME='XXX';
其中T1的NAME型別為:NVARCHAR2
T2的NAME型別為:VARCHAR2[@more@]
這個SQL會發生隱式轉換(VARCHAR2 -> NVARCHAR2),所以,實際執行的SQL是:
SELECT * FROM T1,T2 WHERE T1.NAME=SYS_OP_C2C(T2.NAME) AND T1.NAME=U'XXX';
T2.NAME上多了一個函式,所以不能用到這列上的索引。
這個SQL,應該讓T1和T2都走索引,其實解決方法有兩種:
1、修改SQL
修改方法1:SELECT * FROM T1,T2 WHERE T1.NAME='XXX' AND T2.NAME='XXX';
修改方法2:SELECT * FROM T1,T2 WHERE T1.NAME='XXX' AND TO_CHAR(T1.NAME)=T2.NAME;
由於程式碼修改量大,且很難確保所有SQL都被修改,並且NVARCHAR2佔用的空間多,所以最好的辦法是修改表結構。
2、修改表結構
修改表結構需要聯機修改,否則會影響業務。
在聯機轉換NVARCHAR2到VARCHAR2時,有幾點需要注意:
1)新表的結構VARCHAR2的長度要足夠長,因為NVARCAHR2的長度定義的是字元個數,VARCHAR2定義的是位元組個數。在中文環境下把VARCHAR2的長度定義為NVARCHAR長度的2倍即可。
2)如果主鍵列也需要轉換,則重定義的時候options_flag要用ROWID,不能用主鍵
3)在匹配源表和新表欄位的對應關係時,對源表的列要使用函式轉換
舉一個例子如下:
drop table k1 purge;
drop table k2 purge;
create table k1(a nvarchar2(10) primary key,b nvarchar2(10),c nvarchar2(10));
create table k2(a varchar2(30) primary key,b varchar2(10),c varchar2(10));
insert into k1(a) values('abcsdfsdsa');
insert into k1(a) values('1234567890');
insert into k1(a) values('我是中國人收到測一下');
commit;
exec dbms_redefinition.can_redef_table('suk','k1');
exec DBMS_REDEFINITION.START_REDEF_TABLE('SUK','K1','K2','Translate(a USING CHAR_CS) a,Translate(b USING CHAR_CS) b,Translate(c USING CHAR_CS) c',dbms_redefinition.cons_use_rowid)
exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SUK','K1','K2')
exec dbms_redefinition.finish_redef_table('SUK','K1','K2')
--其中TRANSLATE ... USING 函式用於資料庫字符集和國家字符集之間轉換
--dbms_redefinition.cons_use_rowid用於指定轉換主鍵時的 option_flag為rowid
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/231499/viewspace-1013357/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- sql語句修改欄位型別和增加欄位SQL型別
- 多型關聯自定義的型別欄位的處理多型型別
- Oracle 修改欄位型別和長度Oracle型別
- 關於mysql中欄位定義的型別int、tinyint區別MySql型別
- Mysql varchar型別欄位為什麼經常定義為255MySql型別
- [提問交流]建立模型,新增屬性,欄位型別如何設定2位小數的欄位型別模型型別
- ORANCLE 資料已存在,修改欄位型別長度型別
- MySQL VARCHAR型別欄位到底可以定義多長MySql型別
- MongoDB更改欄位型別MongoDB型別
- 6. 自定義容器型別元素驗證,類級別驗證(多欄位聯合驗證)型別
- ES Mapping ,1 欄位型別APP型別
- MySQL欄位型別最全解析MySql型別
- SqlSugar code first 欄位為列舉型別,預設生成資料庫欄位為bigint如何設定為int型別SqlSugar型別資料庫
- 【mongo】mongo 欄位型別互轉Go型別
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- 物聯網學習教程—用typedef定義型別型別
- mysql表操作(alter)/mysql欄位型別MySql型別
- Typescript 下 Mongoose 外來鍵型別&外來鍵陣列型別定義&型別保護&聯合型別理解TypeScriptGo型別陣列
- 聯機重定義表在10g的改進
- 建議欄位別名定義定義那裡順便可定義預設值,這預設值還可以是函式函式
- MySQL中TEXT與BLOB欄位型別的區別MySql型別
- JSON欄位型別在ORM中的使用JSON型別ORM
- Vue 兩個欄位聯合校驗典型例子--修改密碼Vue密碼
- Gson針對API返回欄位型別不確定的解決辦法API型別
- [需求建議]建議欄位別名定義定義那裡順便可定義預設值,這預設值還可以是函式函式
- PHP 操作 mysql blob 資料型別的欄位PHPMySql資料型別
- Golang通脈之型別定義Golang型別
- sql小筆記(增刪改查——新增列、修改表名、列的欄位型別等)SQL筆記型別
- 欄位管理,為什麼只有新增的時候才自動匹配欄位型別型別
- Java資料型別與資料庫欄位型別對應關係Java資料型別資料庫
- C++中過載、重寫、重定義的區別C++
- 物聯網學習教程—定義結構體型別變數的方法結構體型別變數
- SAP WM中階儲存型別裡的Full stk rmvl 欄位和Return Storage type欄位型別
- oracle 修改表欄位的長度Oracle
- 資料庫中欄位資料型別以及約束資料庫資料型別
- MYSQL SET型別欄位的SQL操作知識介紹MySql型別
- linux top命令欄位含義Linux
- 定義一個單例型別的Qml單例型別