Linux下更改oracle客户端字符集和服务端字符集

本文介绍了如何在Linux系统下更改Oracle客户端和服务端的字符集。客户端可以通过编辑/etc/environment文件设置NLS_LANG环境变量。服务端字符集的修改涉及一系列SQL命令,包括关闭数据库、启用受限会话、更改字符集并重启数据库。此外,还提到了如何修改dmp文件的字符集以适应Oracle检查。

Linux 下更改 oracle 客户端字符集和服务端字符集

 

1.Linux 下更改 oracle 客户端字符集,即设置环境变量“ NLS_LANG“ 的值

查看客户端字符集,在终端下执行:

echo $NLS_LANG

 

修改客户端字符集:

sudo gedit /etc/environment

在environment 文件中增加以下内容:

NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

export NLS_LANG

重新启动操作系统即可。

2. 修改 oracle 服务端的字符集。

查看服务端字符集:

select userenv('language') from dual;

修改服务端字符集,终端下执行:

$ORACLE_HOME/bin/sqlplus /nolog

进入sqlplus 命令行

SQL>conn / as sysdba;

1 ) . 关闭数据库

SQL>SHUTDOWN IMMEDIATE;

2 ) . 启动到 Mount

STARTUP MOUNT;

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

ALTER SYSTEM SET AQ_TM_PROCESSES=0;

ALTER DATABASE OPEN;

ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;

-- 下面一行语句可能会出现错误提示,可以不理会

ALTER DATABASE national CHARACTER SET INTERNAL ZHS16GBK;

SHUTDOWN IMMEDIATE;

STARTUP;

3. 修改 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 即可。

 

Oracle 提供标准函数,对字符集名称及 ID 进行转换 :

SQL> select nls_charset_id('ZHS16GBK') from dual;

NLS_CHARSET_ID('ZHS16GBK')

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

852

1 row selected.

 

SQL> select nls_charset_name(852) from dual;

NLS_CHAR

--------

ZHS16GBK

1 row selected.

 

十进制转换十六进制 :

SQL> select to_char('852','xxxx') from dual;

TO_CH

-----

354


参考文章:

《Oracle 字符集的查看和修改》:

http://blog.youkuaiyun.com/tianlesoftware/archive/2009/12/02/4915223.aspx

《字符集问题的初步探讨( 五)- 导出文件字符集》:

http://www.eygle.com/special/NLS_CHARACTER_SET_05.htm

<think>好的,用户现在想了解如何简单查询Oracle客户端和服务字符集编码。之前他们问过关于配置字符集的问题,现在可能在实际操作中遇到了需要检查字符集的情况,比如数据乱码或者迁移问题。我需要用更简洁的方式来回答,避免之前的详细步骤,但要确保信息准确。 首先,用户可能不太熟悉Oracle的查询命令,所以需要给出具体的SQL语句和检查方法。客户端和服务字符集不同可能导致乱码,所以分开说明很重要。 客户端字符集通常通过NLS_LANG环境变量设置,但用户可能需要知道如何查看当前会话的字符集,这可以通过查询nls_session_parameters。而服务字符集数据库创建时设置,可以通过nls_database_parameters来查,或者v$parameter视图。 需要注意客户端和服务是否一致,特别是当出现乱码时,这两者的匹配很重要。另外,用户可能需要知道如何检查客户端的NLS_LANG设置,尤其是在不同操作系统下的方法,比如Windows的注册表和Linux的环境变量。 要确保回答步骤清晰,代码示例明确,并提醒用户关键点,比如修改字符集的限制和一致性检查。可能用户已经尝试过修改配置,现在需要验证是否正确应用了。 最后,总结部分要简明扼要,强调检查一致性的重要性,以及需要时的处理步骤。可能用户是开发人员或DBA,需要快速解决问题,所以信息要直接,避免冗长。</think>以下是 **简化版** 的 Oracle 客户端与服务字符集查询方法: --- ### **一、查询服务字符集** 直接在数据库服务器上执行: ```sql -- 查看数据库字符集(服务) SELECT * FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET'); -- 输出示例: PARAMETER VALUE ----------------------- -------------- NLS_CHARACTERSET ZHS16GBK -- 默认字符集 NLS_NCHAR_CHARACTERSET AL16UTF16 -- 国家字符集 ``` --- ### **二、查询客户端字符集** #### **1. 查看客户端会话字符集** 在客户端工具(如 SQL*Plus)中执行: ```sql -- 查看当前客户端字符集设置 SELECT * FROM nls_session_parameters WHERE parameter IN ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET'); -- 输出示例: PARAMETER VALUE ----------------- ------------ NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CHARACTERSET ZHS16GBK -- 客户端字符集 ``` #### **2. 查看客户端配置 `NLS_LANG`** - **Windows**: 打开注册表,路径: `HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_<OracleHomeName>\NLS_LANG` 或通过命令行: ```bash echo %NLS_LANG% ``` - **Linux/Mac**: 执行命令查看环境变量: ```bash echo $NLS_LANG ``` --- ### **三、关键点** 1. **客户端与服务一致性**: 若 `客户端字符集`(NLS_LANG)与 `服务字符集`(NLS_CHARACTERSET)不一致,可能导致乱码。 **示例**: - 服务:`ZHS16GBK` - 客户端:`NLS_LANG=AMERICAN_AMERICA.AL32UTF8` → 可能乱码! 2. **优先以服务字符集为准**: 若需修改字符集,服务只能在创建数据库时配置,客户端通过 `NLS_LANG` 环境变量调整。 --- ### **总结** | 角色 | 查询方式 | 关键参数 | |----------|------------------------------|------------------------| | 服务 | `nls_database_parameters` | NLS_CHARACTERSET | | 客户端 | `nls_session_parameters` | NLS_CHARACTERSET | | 客户端 | 环境变量 `NLS_LANG` | 格式:语言_地区.字符集 |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值