數(shù)據(jù)庫字符集在創(chuàng)建后原則上不能更改。不過有2種方法可行。
鯉城ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
1. 如果需要修改字符集,通常需要導(dǎo)出數(shù)據(jù)庫數(shù)據(jù),重建數(shù)據(jù)庫,再導(dǎo)入數(shù)據(jù)庫數(shù)據(jù)的方式來轉(zhuǎn)換。
2. 通過ALTER DATABASE CHARACTER SET語句修改字符集,但創(chuàng)建數(shù)據(jù)庫后修改字符集是有限制的,只有新的字符集是當(dāng)前字符集的超集時才能修改數(shù)據(jù)庫字符集,例如UTF8是US7ASCII的超集,修改數(shù)據(jù)庫字符集可使用ALTER DATABASE CHARACTER SET UTF8。
首先方法是使用RENAME關(guān)鍵字:
修改字段名:alter table 表名 rename column 現(xiàn)列名 to 新列名;
修改表名:alter table 表名 rename to 新表名
增加字段語法:alter table tablename add (column datatype [default value][null/not null],….);
說明:alter table 表名 add (字段名 字段類型 默認(rèn)值 是否為空);
例: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 (字段名 字段類型?默認(rèn)值 是否為空);
例: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是關(guān)鍵字)
例:alter table sf_InvoiceApply rename column PIC to NEWPIC;
表的重命名:
說明:alter table 表名 rename to? 新表名
例:alter table?sf_InvoiceApply rename to??sf_New_InvoiceApply;
默認(rèn)情況下,oracle的分區(qū)表對于分區(qū)字段是不允許進(jìn)行update操作的,如果有對分區(qū)字段行進(jìn)update,就會報錯——ORA-14402: 更新分區(qū)關(guān)鍵字列將導(dǎo)致分區(qū)的更改。但是可以通過打開表的row movement屬性來允許對分區(qū)字段的update操作。
例:創(chuàng)建分區(qū)表test_part進(jìn)行實驗
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)
);
插入如下的數(shù)據(jù)
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
分區(qū)P1、P2的數(shù)據(jù)分別為:
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: 更新分區(qū)關(guān)鍵字列將導(dǎo)致分區(qū)的更改
打開row movement屬性
SQL alter table test_part enable row movement;
Table altered
再次執(zhí)行update操作
SQL update test_part set a1=1123 where a1=123;
1 row updated
執(zhí)行是成功的并遷移到分區(qū)P2上了,且這時候rowid也發(fā)生了變化
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可以允許數(shù)據(jù)段的壓縮、update分區(qū)字段的數(shù)據(jù)(跨分區(qū)的)
轉(zhuǎn)載自寒思國內(nèi)最常用的Oracle字符集ZHS16GBK(GBK
16-bit
Simplified
Chinese)能夠支持繁體中文,并且按照2個字符長度存儲一個漢字。UTF8字符集是多字節(jié)存儲,1個漢字(簡體、繁體)有時采用3個字符長度存儲。
Oracle支持字符集的更改,但是UTF8是Oracle中最大的字符集,也就是說UTF8是ZHS16GBK的嚴(yán)格超集。
對于子集到超集的轉(zhuǎn)換,Oracle是允許的,但是對于超集到子集的轉(zhuǎn)換是不允許的。一般對于超集到子集的轉(zhuǎn)換,建議是通過dbca刪除原來的數(shù)據(jù)庫,重新再建庫,選擇正確的字符集,然后導(dǎo)入備份。
我的方案是:先備份數(shù)據(jù),然后強(qiáng)制轉(zhuǎn)換字符集從UTF8到ZHS16GBK,然后導(dǎo)入備份數(shù)據(jù)。如果不行,才來重新建庫,設(shè)置字符集ZHS16GBK,導(dǎo)入備份數(shù)據(jù)。如果這還不行,就把更改字符集從ZHS16GBK到UTF8(這是安全的),再導(dǎo)入備份數(shù)據(jù),恢復(fù)到原始狀況。這樣就有可能避開重新建庫的麻煩。
1.
備份數(shù)據(jù)庫中所有用戶的數(shù)據(jù)
以oracle用戶登陸,執(zhí)行以下命令
#
export
NLS_LANG
=
“SIMPLIFIED
CHINESE_CHINA.UTF8”
保持與數(shù)據(jù)庫服務(wù)器端一致,這樣在exp導(dǎo)出時,就不會存在字符的轉(zhuǎn)換了,備份最原始的數(shù)據(jù)。
2.
評估UTF8轉(zhuǎn)換成ZHS16GBK的風(fēng)險
轉(zhuǎn)換之前,要使用Oracle的csscan工具對數(shù)據(jù)庫掃描,評估字符集轉(zhuǎn)換前后,數(shù)據(jù)有可能的損壞情況。如果評估情況糟糕,那就絕對要放棄了。
先安裝屬于
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中的所有數(shù)據(jù),從字符集UTF8更改為ZHS16GBK的轉(zhuǎn)換情況。然后得到三個文件:scan.txt、scan.out、scan.err。
查看scan.out,scan.err,可以看出mmsc用戶下的所有的數(shù)據(jù)都是可以轉(zhuǎn)換的,并且沒有出現(xiàn)轉(zhuǎn)換“Exceptional”的情況,因此可以更放心一點。
3.
更改數(shù)據(jù)庫的字符集為ZHS16GBK
前面說過,通過命令“Alter
Database
Characeter
Set
XXXX”,實現(xiàn)從超集到子集的轉(zhuǎn)換,在Oracle是不允許的。但是該命令,提供這樣的命令方式:
Alter
Database
Character
Set
INTERNAL_CONVERT/
INTERNAL_USE
XXXX
這是Oracle的非公開命令?!霸谑褂眠@個命令時,Oracle會跳過所有子集及超集的檢查,在任意字符集之間進(jìn)行強(qiáng)制轉(zhuǎn)換,所以,使用這個命令時你必須十分小心,你必須清楚這一操作會帶來的風(fēng)險”。
以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”參數(shù),系統(tǒng)會提示出錯:
//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;
此時,檢查一下數(shù)據(jù)庫的字符集是否更改過來
SQL
select
value$
from
props$
where
name=’NLS_CHARACTERSET’;
VALUE$
-----------------
ZHS16GBK
緊接著檢查一下數(shù)據(jù)庫中簡體中文、繁體中文是否正常,不會出現(xiàn)亂碼。
SQLselect
spid,spname,spshortname
from
spinfovisual_hk
…...
非常不幸,我看到了一堆亂碼,這也證明了Oracle不支持字符集從超集到子集的更改,當(dāng)時心里很緊張,很怕失敗,從而恢復(fù)到原樣。
但是根據(jù)以前的驗證,把UTF8下的備份導(dǎo)入到ZHS16GBK中去,是OK的,所以繼續(xù)嘗試。
4.
導(dǎo)入備份的用戶數(shù)據(jù)
還是以oracle用戶登陸UNIX,
先刪除庫中的用戶mmsc:
#sqlplus
“/
as
sysdba”
SQLdrop
user
mmsc
cascade;
SQLexit
再運行createuser.sql,生成mmsc用戶。
然后使用原來的備份文件,導(dǎo)入到mmsc用戶中:
注意:先設(shè)置NLS_LANG要與當(dāng)前數(shù)據(jù)庫的一致:ZHS16GBK。這樣,導(dǎo)出時用戶會話的NLS_LANG為UTF8,與原先的數(shù)據(jù)庫字符集一致;現(xiàn)在為ZHS16GBK,與此時的數(shù)據(jù)庫字符集一致。這樣,導(dǎo)入時,就會進(jìn)行字符轉(zhuǎn)換。
#
export
NLS_LANG
=
“SIMPLIFIED
CHINESE_CHINA.ZHS16GBK”
#imp
mmsc/mmsc@mdspdb
file=DSMPD113_user_mmsc.dmp
ignore=y
fromuser=mmsc
touser=mmsc
馬上查看數(shù)據(jù)庫中簡體、繁體中文,哈哈,沒有亂碼了,一切顯示正常。
緊接著進(jìn)行驗證,也證明了:1個漢字此時只占用2個字符長度。問題解決了!
1.修改服務(wù)器端oracle默認(rèn)字符集:打開“開始菜單”,在“運行”里輸入“cmd”,回車,進(jìn)入命令行編
輯模式。輸入“sqlplus /nolog”,回車。修改默認(rèn)字符集,以sysdba的身份執(zhí)行SQL語句。輸入“conn
sys/password@orcl as sysdba;”,回車。輸入“select name,value$ from props$ where
name like
’%NLS%’;”,查看默認(rèn)字符集。找到“NLS_CHARACTERSET”,其值為“WE8ISO8859P1”。
2.修改客戶端sqlplus默認(rèn)字符集:打開“開始菜單”,
在“運行”里輸入“regedit”,回車,進(jìn)入注冊表編輯器。按CTRL+F,輸入“NLS_LANG”,回車,找到sqlplus軟件目錄下的
NLS_LANG,其鍵值為“WE8ISO8859P1”。雙擊“NLS_LANG”,輸入“ZHS16GBK”,點擊“確定”按鈕保存重啟計算
機(jī)。
文章題目:oracle怎么改字 oracle怎么改字符集
當(dāng)前地址:http://jinyejixie.com/article8/hepiop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、品牌網(wǎng)站建設(shè)、網(wǎng)站營銷、網(wǎng)頁設(shè)計公司、用戶體驗、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)