Linux下oracle显示问号,Linux下oracle插入(导入)中文记录显示为问号问题及解决办法...

字符集

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 createdSQL> select * from test;SQL> select * from test;ID NAME

---------- ------------

1 ????

2 ????

3 王五OK,现在看到刚插入的可以正常显示了,但是之前的还是无法显示,之前插入的记录由于无法进行正确的转换,即使修

总结:

就三步: 1:数据库编码的字符集(查询 :select userenv('language') from dual; 2:客户端编码的字符集 oracle 修改.bash_profile 文件。(操作如上) 3:系统的显示编码字符集

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux下,当使用PL SQL Developer查询结果中的中文变成了一堆问号,或者SQL语句中的中文被提示为invalid character时,可能是由于字符集设置不正确导致的。你可以尝试以下方法来解决这个问题: 1. 确保数据库字符集设置正确:可以通过以下SQL语句来查看和修改数据库字符集: ```sql -- 查看数据库字符集 SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'; -- 修改数据库字符集(需要先备份数据库) ALTER DATABASE CHARACTER SET <character_set_name>; ``` 其中,`<character_set_name>`是你想要设置的字符集名称,例如AL32UTF8。 2. 确保PL SQL Developer的字符集设置正确:可以在PL SQL Developer的首选项中进行设置。依次点击"Tools" -> "Preferences" -> "Environment" -> "Fonts and Colors",然后选择正确的字符集。 3. 确保操作系统的字符集设置正确:可以通过以下命令来查看和修改操作系统的字符集: ```shell # 查看当前字符集 locale # 修改字符集(需要root权限) sudo dpkg-reconfigure locales ``` 在弹出的界面中选择正确的字符集,然后重启系统使设置生效。 4. 确保数据库和PL SQL Developer使用的字符集一致:可以在PL SQL Developer的连接配置中设置字符集,确保与数据库的字符集一致。 5. 如果以上方法都无效,可以尝试将查询结果导出为文件,然后用其他工具打开查看,看是否能正确显示中文字符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值