新安装的数据库,导入数据之后,发现插入汉字部分是乱码。由于本地数据时正常显示的,没有乱码。因此断定是数据库字符集的问题。
1、 查看数据库的字符集:
发现是西欧编码、8位(一个字节)、ISO标准8859P1编码。他的编码方案是适合欧洲大部分国家。
又查询了一下本地数据库的编码格式,发现是ZHS16GBk编码格式。
在这里解释一下字符集,Oracel最早支持的编码方案是US7ASCII。
再解释一下Oracle字符集的命名遵循以下命名规则:
<Language><bit size><encoding>
即:<语言><比特位数><编码>
比如: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、 删除原来的数据,重新导入新的数据
修改字符集之后,里面的数据任然是乱码,因此需要重新导入数据。