【Oracle】数据库乱码问题的解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wk1134314305/article/details/78012629

1,查看服务端的字符集
select userenv(‘language’) from dual;
更详细一点可以用下面的sql方式查看
select * from nls_database_parameters;

2,windows下查看客户端的字符集
查看注册表信息
win+r,输入regedit,打开注册表
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDB12Home1下面有一个NLS_LANG项。
linux下是查看环境变量

3,查看dmp文件的字符集

用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:

SQL> select nls_charset_name(to_number(‘0354’,’xxxx’)) from dual;

ZHS16GBK

怎么修改字符集?

1,修改客户端的字符集

直接修改注册表中的NLS_LANG下的字符集设置

2,修改服务端的字符集

cmd-> sqlplus /nolog
sql->conn / 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 AL32UTF8;

ORA-12712: new character set must be a superset of old character set
RROR at line 1:
结果报错,提示新字符集必须是老字符集的超集。
于是强制转换

sql->ALTER DATABASE character set INTERNAL_USE AL32UTF8;
sql->shutdown immediate;
sql->STARTUP;

上面的字符集转换,如果是从子集到父集,需要使用INTERNAL_USE 参数,跳过超子集检测。

部分表格的乱码问题

针对数据库中的部分表,因为可能导入时候出现编码不符,导致乱码。
那么就需要针对个别情况进行数据的字符集转换,采用函数convert(the string you want to transcode, source_character_set,dest_character_set)
如下面的例子

update table set xzqh=convert(xzqh, ‘ZHS16GBK’, ‘AL32UTF8’)

猜你喜欢

转载自blog.csdn.net/wk1134314305/article/details/78012629