日期:2014-05-17  浏览次数:20763 次

出现乱码问题?
本机没安oracle 安装了PLSQL和client ,查询刚才插入表中的中文数据却显示“?”是怎么一回事,说详细点,本人刚接处,基本上什么吗都不懂!哈哈!

------解决方案--------------------
字段的数据类型是什么? 用nvarchar试试.
------解决方案--------------------
你的客户端NLS_LANG是英文,而数据库的NLS_LANG是中文,你只需注册表中NLS_LANG改为中文即可。HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0

"NLS_LANG"值改为"SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

------解决方案--------------------
SQL code
oracle 10g装上后,建了个表写入中文数据,发现通过工具DbVisualizer 6.5 写入/读取中文都正常,就sqlplus和PL/SQL Developer不正常.

初步怀疑是DbVisualizer本身定义了字集编码,而sqlplus和PL/SQL Developer则没有.无论怎么样,要正常显示中文,就必须得服务器和客户端编码一致才行.于是检查.

1.检查服务器编码:

执行SQL语法:

select * from v$nls_parameters;



也可以参照/home/oracle/.bash_profile 相关语言设置.
可以看到我的相关设置是:

LANG=zh_CN.GBK  
NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

2.设置本地客户端编码:

进入 我的电脑,属性,高级,环境变量,添加2项:

LANG=zh_CN.GBK  
NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

如图:


3.重新连接sqlplus,查看数据:



显示正常.

4.PL/SQL Developer设置并重新连接:

在pl/sql developer的菜单->tools->preferences->user interface->fonts 中修改为中文字体

重新连接

显示正常.OK!

------解决方案--------------------
把 major 改为NVARCHAR2(30)试试呢?

------解决方案--------------------
1、修改server端字符集(不建议使用)

在oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后,至少有三张系
统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:

$sqlplus /nolog

SQL>conn / as sysdba;   若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服
务器,然后执行以下命令:

SQL>STARTUP MOUNT;

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;

SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;

SQL>SHUTDOWN IMMEDIATE;

SQL>STARTUP

注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,
不然不能start) 
按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 
这样的提示信息

要解决这个问题有两种方法

一个是,利用INTERNAL_USE 关键字修改区域设置,

还有一个是利用re-create,但是re-create有点复杂,所以请用internal_use,

SQL>SHUTDOWN IMMEDIATE;

SQL>STARTUP MOUNT EXCLUSIVE;

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 national character set internal_use utf8;

SQL>alter database character set internal_use zhs16gbk;

SQL>SHUTDOWN immediate;

SQL>startup;

如果按上面的做法做,National charset的区域设置就没有问题

2、修改dmp文件字符集

上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘

骗’过oracle的检查。
这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,
如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。

具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。

比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:   
SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;

0354

然后将dmp文件的2、3字节修改为0354即可。

如果dmp文件很大,用ue无法打开,就需要用程序的方法了



1.操作系统认证:即oracle认为操作系统用户是可靠的,即既然能登陆到操作系统那么oracle数据库你也能登陆
2.口令文件认证:oracle认证认为操作系统用户是不可信任的,如果要访问数据库,必须进行再次认证。

具体实现如下:
1.操作系统认证:
配置sqlnet.ora文件中的参数:SQLNET.AUTHENTICATION_SERVICES=(NTS)
spfile(pfile)文件参数:REMOTE_LOGIN_PASSWORDFILE=('NONE')
这个时候,只要你登陆操作系统oracle用户后,就可以直接conn /as sysdba登陆数据库了。但是不能通过oracle的client去
直接连接/as sysdba。如客户端SQLPLUSw或者其它客户端软件直接conn /as sysbd 。