日期:2014-05-17 浏览次数:20829 次
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 。