Linux下oracle插入(导入)中文记录显示为问号问题及解决办法
2011-05-22 19:59
796 查看
Blog Transferred to: http://www.kanhua.org
字符集
oracle官方关于字符集和NLS_LANG的解答:http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20faq.htm
首先要明确什么是字符集?字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包括关系,如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失,Oracle对这种问题也要求从子集到超集的导出受支持,反之不行。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多),。
其次,一旦数据库创建后,数据库的字符集是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集是十分重要的。数据库字符集应该是操作系统本地字符集的一个超集。存取数据库的客户使用的字符集将决定选择哪一个超集,即数据库字符集应该是所有客户字符集的超集。
nls_lang变量:
Windows下:在系统的环境变量里和注册表里可以找到进行设置
Linux下:在oracle用户下的.bash_profile文件里进行设置
NLS_LANG格式:
NLS_LANG = language_territory.charset
有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:language 指定服务器消息的语言。
territory 指定服务器的日期和数字格式。
charset 指定字符集
例如:
AMERICAN _ AMERICA. ZHS16GBK
linux系统语言:
/etc/sysconfig/i18n
[/code]
字符集
oracle官方关于字符集和NLS_LANG的解答:http://www.oracle.com/technology/tech/globalization/htdocs/nls_lang%20faq.htm
首先要明确什么是字符集?字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包括关系,如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失,Oracle对这种问题也要求从子集到超集的导出受支持,反之不行。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多),。
其次,一旦数据库创建后,数据库的字符集是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集是十分重要的。数据库字符集应该是操作系统本地字符集的一个超集。存取数据库的客户使用的字符集将决定选择哪一个超集,即数据库字符集应该是所有客户字符集的超集。
nls_lang变量:
Windows下:在系统的环境变量里和注册表里可以找到进行设置
Linux下:在oracle用户下的.bash_profile文件里进行设置
NLS_LANG格式:
NLS_LANG = language_territory.charset
有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:language 指定服务器消息的语言。
territory 指定服务器的日期和数字格式。
charset 指定字符集
例如:
AMERICAN _ AMERICA. ZHS16GBK
linux系统语言:
/etc/sysconfig/i18n
在Red hat下面/etc/sysconfig/i18n的每一行都是什么意思? LANG="zh_CN.GB18030" SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT="latarcyrheb-sun16"
/etc/sysconfig/i18n 这里存放的是系统的区域语言设置, i18n是 国际化internationalization的缩写 i和n之间正好18个字母 第一行 表明你当前系统的语言环境变量设置 ,这里是 zh_CN.GB18030 第二行 表明系统预置了那些语言支持 ,不在项目中的语言不能正常显示 第三行 定义控制台终端字体,你文本登录的时候显示的字体就是这个 latarcyrheb-sun16
在导入导出oracle数据时,必须将客户端和oracle服务器的字符集设置成一致,否则导入数据库的中文字符很可能是乱码而无法正确显示,然后设置正确的环境变量,然后还要设置操作系统的语言设置,即设置i18n,下面是在服务器上我实验例子:
建立表test
SQL> create table test(id number(2),name char(12));
Table created.
然后插入第一条记录:
SQL> insert into test values(1,'张三');
1 row created.
然后查看:
SQL> select * from test;
ID NAME ---------- ------------ 1 ????
中文显示为???
在服务器上查看数据库服务器字符集
SQL> select userenv('language') from dual;
USERENV('LANGUAGE') ---------------------------------------------------- AMERICAN_AMERICA.ZHS16GBK 如果是从客户端插入或者导入数据必须将客户端的nls_lang变量设置成与服务器一致,这里需将客户端设置库:
AMERICAN_AMERICA.ZHS16GBK
查看oracle服务器的nls_lang变量值:
[oracle@oradb ~]$ echo $NLS_LANG AMERICAN
修改nls_name变量值为:AMERICAN_AMERICA.ZHS16GBK
然后重新登录再做查询:
SQL> select * from test;
ID NAME ---------- ------------ 1 ????
还是问号,做插入测试:
SQL> insert into test values(2,'李四');
1 row created.
SQL> select * from test;
ID NAME ---------- ------------ 1 ????
2 ????
检查i18n文件:
vi /etc/sysconfig/i18n
LANG="en_US.UTF-8" SUPPORTED="zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en" SYSFONT="latarcyrheb-sun16"
将lang的值修改库中文字符集,下面是网上比较全的一个i18n文件设置: (关键)
LANG="zh_CN.gb2312" SUPPORTED="zh_CN.GB18030:zh_CN:zh:zh_CN.GB2312:zh_CN:zh:zh_CN.gbk:zh_CN:zh:zh_HK.UTF-8:zh_HK:zh:zh_CN.UTF-8:zh_CN:zh:zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8:en_US:en" SYSFONT="latarcyrheb-sun16"
修改后重新登录oracle,然后进行查询:
SQL> select * from test;
ID NAME ---------- ------------ 1 ????
2 ????
还是无法正确显示,现在做插入测试: SQL> insert into test values(3,'王五');1 row created
SQL> select * from test;
SQL> select * from test;
ID NAME ---------- ------------ 1 ????
2 ????
3 王五
OK,现在看到刚插入的可以正常显示了,但是之前的还是无法显示,之前插入的记录由于无法进行正确的转换,即使修 总结: 就三步: 1:数据库编码的字符集(查询 :select userenv('language') from dual; 2:客户端编码的字符集 oracle 修改.bash_profile 文件。(操作如上) 3:系统的显示编码字符集
[/code]
相关文章推荐
- linux下oracle occi编程插入数据库中文显示问号问题的解决
- Mysql数据库插入的中文字段值显示问号的问题解决
- Oracle使用——PLSQL的中文乱码显示全是问号解决办法
- [记录]在Linux中Oracle安装成功后,首次启动使用时,会出现的一些问题总结和解决办法
- Linux下hibernate向mysql中插入中文变成问号问题的解决
- secure CRT - linux - oracle :不能显示中文的解决办法
- linux下mysql的中文不能显示及sock链接错误问题的一些解决办法
- 向MOSS站点的数据库中插入中文字符显示为问号‘?’的一种解决办法
- 请教一个问题,Log4Net记录日志到Oracle显示中文乱码如何解决?
- 解决linux下oracle中文乱码的问题
- 日常问题记录--JSP页面中通过<s:property value="#parameters.userName[0]>获取URL参数中文时为乱码的解决办法
- delphi中Label中文显示不全的问题解决办法
- 解决C#中txt文档导入数据库时,中文显示乱码的问题
- Oracle导入中文乱码解决办法
- Java插入中文到数据库中文变成问号???解决办法
- SecureCRT连接linux终端中文显示乱码解决办法
- Python下调用json.dumps中文显示问题解决办法
- linux中文显示乱码的解决办法