數據庫字符集在創建后原則上不能更改。不過有2種方法可行。
鯉城ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為成都創新互聯公司的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
1. 如果需要修改字符集,通常需要導出數據庫數據,重建數據庫,再導入數據庫數據的方式來轉換。
2. 通過ALTER DATABASE CHARACTER SET語句修改字符集,但創建數據庫后修改字符集是有限制的,只有新的字符集是當前字符集的超集時才能修改數據庫字符集,例如UTF8是US7ASCII的超集,修改數據庫字符集可使用ALTER DATABASE CHARACTER SET UTF8。
首先方法是使用RENAME關鍵字:
修改字段名:alter table 表名 rename column 現列名 to 新列名;
修改表名:alter table 表名 rename to 新表名
增加字段語法:alter table tablename add (column datatype [default value][null/not null],….);
說明:alter table 表名 add (字段名 字段類型 默認值 是否為空);
例:alter table sf_users add (HeadPIC blob);
例:alter table?sf_users add (userName varchar2(30) default?'空' not null);
修改字段的語法:alter table tablename modify (column datatype [default value][null/not null],….);
說明:alter table 表名 modify (字段名 字段類型?默認值 是否為空);
例:alter table sf_InvoiceApply modify (BILLCODE number(4));
刪除字段的語法:alter table tablename drop (column);
說明:alter table 表名 drop column 字段名;
例:alter table sf_users drop column HeadPIC;
字段的重命名:
說明:alter table 表名 rename ?column? 列名 to 新列名?? (其中:column是關鍵字)
例:alter table sf_InvoiceApply rename column PIC to NEWPIC;
表的重命名:
說明:alter table 表名 rename to? 新表名
例:alter table?sf_InvoiceApply rename to??sf_New_InvoiceApply;
默認情況下,oracle的分區表對于分區字段是不允許進行update操作的,如果有對分區字段行進update,就會報錯——ORA-14402: 更新分區關鍵字列將導致分區的更改。但是可以通過打開表的row movement屬性來允許對分區字段的update操作。
例:創建分區表test_part進行實驗
create table TEST_PART
(
A1 NUMBERnot null,
A2 DATE not null,
A3 VARCHAR2(6) not null,
A4 DATE not null,
A5 NUMBER not null,
)
partition by range (A1)
(
partition P1 values less than (1000),
partition P2 values less than (2000),
partition P3 values less than (3000),
partition P4 values less than (4000),
partition P5 values less than (5000),
partition P6 values less than (MAXVALUE)
);
插入如下的數據
SQL select * from test_part;
A1 A2 A3 A4 A5
---------- ----------- ------ ----------- ----------
123 2006-06-30 123456 2006-06-30 123
456 2006-06-30 asdfgh 2006-06-30 456
1 2006-06-30 234123 2006-06-30 1
2 2006-06-30 234234 2006-06-30 2
1234 2006-06-30 456789 2006-06-30 1234
1111 2006-06-30 ewrqwe 2006-06-30 1111
2222 2006-06-30 fdafda 2006-06-30 2222
3333 2006-06-30 342342 2006-06-30 3333
5678 2006-06-30 qwerty 2006-06-30 5678
9 rows selected
分區P1、P2的數據分別為:
SQL select rowid,t.* from test_part partition(p1) t;
ROWID A1 A2 A3 A4 A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLoAAGAAAtsEAAB 456 2006-06-30 asdfgh 2006-06-30 456
AAAGLoAAGAAAtsEAAC 1 2006-06-30 234123 2006-06-30 1
AAAGLoAAGAAAtsEAAD 2 2006-06-30 234234 2006-06-30 2
AAAGLoAAGAAAtsEAAE 123 2006-06-30 123456 2006-06-30 123
SQL select rowid,t.* from test_part partition(p2) t;
ROWID A1 A2 A3 A4 A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLwAAGAAA+8MAAC 1234 2006-06-30 456789 2006-06-30 1234
AAAGLwAAGAAA+8MAAD 1111 2006-06-30 ewrqwe 2006-06-30 1111
直接update提示錯誤
SQL update test_part set a1=1123 where a1=123;
update test_part set a1=1123 where a1=123
ORA-14402: 更新分區關鍵字列將導致分區的更改
打開row movement屬性
SQL alter table test_part enable row movement;
Table altered
再次執行update操作
SQL update test_part set a1=1123 where a1=123;
1 row updated
執行是成功的并遷移到分區P2上了,且這時候rowid也發生了變化
SQL select rowid,t.* from test_part partition(p2) t;
ROWID A1 A2 A3 A4 A5
------------------ ---------- ----------- ------ ----------- ----------
AAAGLwAAGAAA+8MAAC 1234 2006-06-30 456789 2006-06-30 1234
AAAGLwAAGAAA+8MAAD 1111 2006-06-30 ewrqwe 2006-06-30 1111
AAAGLwAAGAAA+8PAAB 1123 2006-06-30 123456 2006-06-30 123
SQL
enable row movement可以允許數據段的壓縮、update分區字段的數據(跨分區的)
轉載自寒思國內最常用的Oracle字符集ZHS16GBK(GBK
16-bit
Simplified
Chinese)能夠支持繁體中文,并且按照2個字符長度存儲一個漢字。UTF8字符集是多字節存儲,1個漢字(簡體、繁體)有時采用3個字符長度存儲。
Oracle支持字符集的更改,但是UTF8是Oracle中最大的字符集,也就是說UTF8是ZHS16GBK的嚴格超集。
對于子集到超集的轉換,Oracle是允許的,但是對于超集到子集的轉換是不允許的。一般對于超集到子集的轉換,建議是通過dbca刪除原來的數據庫,重新再建庫,選擇正確的字符集,然后導入備份。
我的方案是:先備份數據,然后強制轉換字符集從UTF8到ZHS16GBK,然后導入備份數據。如果不行,才來重新建庫,設置字符集ZHS16GBK,導入備份數據。如果這還不行,就把更改字符集從ZHS16GBK到UTF8(這是安全的),再導入備份數據,恢復到原始狀況。這樣就有可能避開重新建庫的麻煩。
1.
備份數據庫中所有用戶的數據
以oracle用戶登陸,執行以下命令
#
export
NLS_LANG
=
“SIMPLIFIED
CHINESE_CHINA.UTF8”
保持與數據庫服務器端一致,這樣在exp導出時,就不會存在字符的轉換了,備份最原始的數據。
2.
評估UTF8轉換成ZHS16GBK的風險
轉換之前,要使用Oracle的csscan工具對數據庫掃描,評估字符集轉換前后,數據有可能的損壞情況。如果評估情況糟糕,那就絕對要放棄了。
先安裝屬于
CSMIG
用戶的一套表和過程。以oracle用戶登陸UNIX,
#sqlplus
“/
as
sysdab”
SQL@$ORACLE_HOME/
rdbms/admin/csminst.sql
SQLexit
#
$ORACLE_HOME\bin\csscan
-help
可以更清楚如何使用csscan。
#
$ORACLE_HOME/bin/csscan
system/sunday
user=mmsc
FROMCHAR=UTF8
TOCHAR=ZHS16GBK
ARRAY=102400
PROCESS=3
csscan.log
以上命令意思是掃描用戶:mmsc中的所有數據,從字符集UTF8更改為ZHS16GBK的轉換情況。然后得到三個文件:scan.txt、scan.out、scan.err。
查看scan.out,scan.err,可以看出mmsc用戶下的所有的數據都是可以轉換的,并且沒有出現轉換“Exceptional”的情況,因此可以更放心一點。
3.
更改數據庫的字符集為ZHS16GBK
前面說過,通過命令“Alter
Database
Characeter
Set
XXXX”,實現從超集到子集的轉換,在Oracle是不允許的。但是該命令,提供這樣的命令方式:
Alter
Database
Character
Set
INTERNAL_CONVERT/
INTERNAL_USE
XXXX
這是Oracle的非公開命令。“在使用這個命令時,Oracle會跳過所有子集及超集的檢查,在任意字符集之間進行強制轉換,所以,使用這個命令時你必須十分小心,你必須清楚這一操作會帶來的風險”。
以oracle用戶登陸UNIX,
#sqlplus
“/
as
sysdba”
SQL
SHUTDOWN
IMMEDIATE;
SQL
STARTUP
MOUNT;
SQL
ALTER
SESSION
SET
SQL_TRACE=TRUE;
SQL
ALTER
SYSTEM
ENABLE
RESTRICTED
SESSION;
SQL
ALTER
SYSTEM
SET
JOB_QUEUE_PROCESSES=0;
SQL
ALTER
SYSTEM
SET
AQ_TM_PROCESSES=0;
SQL
ALTER
DATABASE
OPEN;
SQL
ALTER
DATABASE
CHARACTER
SET
ZHS16GBK;
//如果不使用“INTERNAL_USE”參數,系統會提示出錯:
//ERROR
at
line
1:
//ORA-12712:
new
character
set
must
be
a
superset
of
old
character
set
SQL
ALTER
SESSION
SET
SQL_TRACE=FALSE;
SQL
SHUTDOWN
IMMEDIATE;
SQL
STARTUP;
此時,檢查一下數據庫的字符集是否更改過來
SQL
select
value$
from
props$
where
name=’NLS_CHARACTERSET’;
VALUE$
-----------------
ZHS16GBK
緊接著檢查一下數據庫中簡體中文、繁體中文是否正常,不會出現亂碼。
SQLselect
spid,spname,spshortname
from
spinfovisual_hk
…...
非常不幸,我看到了一堆亂碼,這也證明了Oracle不支持字符集從超集到子集的更改,當時心里很緊張,很怕失敗,從而恢復到原樣。
但是根據以前的驗證,把UTF8下的備份導入到ZHS16GBK中去,是OK的,所以繼續嘗試。
4.
導入備份的用戶數據
還是以oracle用戶登陸UNIX,
先刪除庫中的用戶mmsc:
#sqlplus
“/
as
sysdba”
SQLdrop
user
mmsc
cascade;
SQLexit
再運行createuser.sql,生成mmsc用戶。
然后使用原來的備份文件,導入到mmsc用戶中:
注意:先設置NLS_LANG要與當前數據庫的一致:ZHS16GBK。這樣,導出時用戶會話的NLS_LANG為UTF8,與原先的數據庫字符集一致;現在為ZHS16GBK,與此時的數據庫字符集一致。這樣,導入時,就會進行字符轉換。
#
export
NLS_LANG
=
“SIMPLIFIED
CHINESE_CHINA.ZHS16GBK”
#imp
mmsc/mmsc@mdspdb
file=DSMPD113_user_mmsc.dmp
ignore=y
fromuser=mmsc
touser=mmsc
馬上查看數據庫中簡體、繁體中文,哈哈,沒有亂碼了,一切顯示正常。
緊接著進行驗證,也證明了:1個漢字此時只占用2個字符長度。問題解決了!
1.修改服務器端oracle默認字符集:打開“開始菜單”,在“運行”里輸入“cmd”,回車,進入命令行編
輯模式。輸入“sqlplus /nolog”,回車。修改默認字符集,以sysdba的身份執行SQL語句。輸入“conn
sys/password@orcl as sysdba;”,回車。輸入“select name,value$ from props$ where
name like
’%NLS%’;”,查看默認字符集。找到“NLS_CHARACTERSET”,其值為“WE8ISO8859P1”。
2.修改客戶端sqlplus默認字符集:打開“開始菜單”,
在“運行”里輸入“regedit”,回車,進入注冊表編輯器。按CTRL+F,輸入“NLS_LANG”,回車,找到sqlplus軟件目錄下的
NLS_LANG,其鍵值為“WE8ISO8859P1”。雙擊“NLS_LANG”,輸入“ZHS16GBK”,點擊“確定”按鈕保存重啟計算
機。
文章題目:oracle怎么改字 oracle怎么改字符集
當前地址:http://vcdvsql.cn/article8/hepiop.html
成都網站建設公司_創新互聯,為您提供軟件開發、品牌網站建設、網站營銷、網頁設計公司、用戶體驗、電子商務
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯