新安装的数据库,导入数据之后,发现插入汉字部分是乱码。由于本地数据时正常显示的,没有乱码。因此断定是数据库字符集的问题。
1、查看数据库的字符集:
发现是西欧编码、8位(一个字节)、ISO标准8859P1编码。他的编码方案是适合欧洲大部分国家。
又查询了一下本地数据库的编码格式,发现是ZHS16GBk编码格式。
在这里解释一下字符集,Oracel最早支持的编码方案是US7ASCII。
再解释一下Oracle字符集的命名遵循以下命名规则:
即:
比如:ZHS16GBK表示采用GBK编码、16位(两个字节)简体中文字符集。
现在已经发现问题原因,下面就是如何修改Oracle的字符集。
2、修改数据库字符集
数据库字符集在创建后原则上不能修改,因为字符集是在数据创建时指定的。可以指定
NLS_CHARACTERSET ZHS16GBK表示字符集
NLS_NCHAR_CHARACTERSET AL16UTF16国家字符集
在这里总结两种方法:
(1)通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换。
(2)通过ALTER DATABASE CHARACTER SET 语句修改字符集,但创建数据库后修改字符集是有限的,只有新的字符集是当前字符集的超集时才能修改字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。现在只介绍方法二。
首先用管理员用户与数据库建立连接。
SQL>shutdown immediate;
Databaseclosed.
Databasedismounted.
ORACLEinstance shut down.
SQL> startup mount;
ORACLEinstance started.
TotalSystem Global Area 1140850688 bytes
FixedSize 2020224 bytes
VariableSize 301993088 bytes
DatabaseBuffers 822083584 bytes
RedoBuffers 14753792 bytes
Databasemounted.
SQL> ALTER SESSION SET SQL_TRACE=TRUE;
Sessionaltered.
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
Systemaltered.
SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
Systemaltered.
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
Systemaltered.
SQL>alter database open;
Databasealtered.
SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTERDATABASE CHARACTER SET ZHS16GBK
*
ERROR atline 1:
ORA-12712:new character set must be a superset of old character set
碰到这个问题是必然的,可以不理会这这个错误,可以路过超集的检查。
SQL>ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
Databasealtered.
SQL>shutdown immediate;
Databaseclosed.
Databasedismounted.
ORACLEinstance shut down.
SQL> startup
ORACLEinstance started.
TotalSystem Global Area 1140850688 bytes
FixedSize 2020224 bytes
VariableSize 301993088 bytes
DatabaseBuffers 822083584 bytes
RedoBuffers 14753792 bytes
Databasemounted.
Databaseopened.
3、修改之后验证
(1)修改之前状态:SQL> select * from v$nls_parameters;
PARAMETER VALUE
--------------------------------------------------------------------------------------------------------------------------------
NLS_LANGUAGE SIMPLIFIED CHINESE
NLS_TERRITORY CHINA
NLS_CURRENCY ¥
NLS_ISO_CURRENCY CHINA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE SIMPLIFIED CHINESE
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFFAM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RRHH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY¥
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
19 rows selecte
4、删除原来的数据,重新导入新的数据
修改字符集之后,里面的数据任然是乱码,因此需要重新导入数据。