您的位置:首页 > 数据库 > Oracle

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

2017-09-17 19:38 501 查看
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’)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 oracle 乱码