SYS@BALLONTT> select ASCIISTR('你好ab') from dual;
ASCIISTR(' 好ab')
--------------------------------
\FFFD\FFFD\FFFD\FFFD\FFFD\FFFDab
结果显示中字段的名字乱码,”你”字没有了
首先,考虑系统的字符集
[oracle@bjr1p2 ~]$ echo $LANG
en_US.UTF-8
字符集为UTF-8,支持中文编码
再来查看数据库字符集
SYS@BALLONTT> select * from v$nls_parameters
2 where parameter='NLS_CHARACTERSET';
PARAMETER VALUE
-------------------- --------------------
NLS_CHARACTERSET US7ASCII
数据库字符集为US7ASCII,此字符集虽然支持中文编码,但是是使用了单字节编码。如果采用单字节的字符集来存储中文信息,数据库的字符集虽然是US7ASCII编码,但里面存储的数据编码实际上却是另外的编码格式,这种不一致的情况很容易引起问题,建议不要这样使用。
那如果数据库的字符集换成其他字符集(如双字节编码的ZHS16GBK)还会出现这种问题吗?
实验一下便知道了,我仍然在此数据库上进行实验操作,所以将数据库的字符集由US7ASCII更改为ZHS16GBK。
(数据库的字符集修改有两种方法:1.将数据逻辑导出,重新建库,在导入 2.使用命令直接修改。但是,数据库字符集的修改可能会存在安全隐患,一般不建议进行直接修改)
数据库字符集的修改:
SYS@BALLONTT> shutdown immediate;
SYS@BALLONTT> startup mount
SYS@BALLONTT> ALTER SESSION SET SQL_TRACE=TRUE;
Session altered.
SYS@BALLONTT> ALTER SYSTEM ENABLE RESTRICTED SESSION;
System altered.
SYS@BALLONTT> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
System altered.
SYS@BALLONTT> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
System altered.
SYS@BALLONTT> alter database open;
Database altered.
SYS@BALLONTT> ALTER DATABASE CHARACTER SET ZHS16GBK;
ALTER DATABASE CHARACTER SET ZHS16GBK
*
ERROR at line 1:
ORA-12716: Cannot ALTER DATABASE CHARACTER SET when CLOB data exists
如果报错,执行如下语句跳过检查:
SYS@BALLONTT> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
Database altered.
重启
SYS@BALLONTT> shutdown immediate;
SYS@BALLONTT> startup;
查看数据库字符集
SYS@BALLONTT> select * from v$nls_parameters
2 where parameter='NLS_CHARACTERSET';
PARAMETER VALUE
-------------------- --------------------
NLS_CHARACTERSET ZHS16GBK
已经修改为ZHS16GBK
再来测试一下汉字的插入
SYS@BALLONTT> select ASCIISTR('你好') from dual;
ASCIISTR('你好')
\6D63\72B2\30BD
没有任何问题
ballontt
2013/8/6
---The End---
如需转载,请标明出处和链接,大谢!
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27425054/viewspace-767861/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27425054/viewspace-767861/