千家信息网

查看和修改Oracle数据库字符集

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,1、查询oracle server端的字符集SQL> select userenv('language') from dual;USERENV('LANGUAGE')-----------------
千家信息网最后更新 2024年09月22日查看和修改Oracle数据库字符集

1、查询oracle server端的字符集

SQL> select userenv('language') from dual;USERENV('LANGUAGE')----------------------------------------------------AMERICAN_AMERICA.ZHS16GBKSQL> 或者SQL> set line 150SQL> col parameter for a30SQL> col value for a30SQL> select * from nls_database_parametersPARAMETER                      VALUE------------------------------ ------------------------------NLS_RDBMS_VERSION              12.1.0.2.0NLS_NCHAR_CONV_EXCP            FALSENLS_LENGTH_SEMANTICS           BYTENLS_COMP                       BINARYNLS_DUAL_CURRENCY              $NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZRNLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZRNLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AMNLS_TIME_FORMAT           HH.MI.SSXFF AMNLS_SORT                       BINARYNLS_DATE_LANGUAGE              AMERICANPARAMETER                      VALUE------------------------------ ------------------------------NLS_DATE_FORMAT           DD-MON-RRNLS_CALENDAR                   GREGORIANNLS_NUMERIC_CHARACTERS         .,NLS_NCHAR_CHARACTERSET         AL16UTF16NLS_CHARACTERSET               ZHS16GBKNLS_ISO_CURRENCY               AMERICANLS_CURRENCY                   $NLS_TERRITORY                  AMERICANLS_LANGUAGE                   AMERICAN20 rows selected.SQL>

来源于props$,是表示数据库的字符集。


2、如何查询dmp文件的字符集
用oracle的exp工具导出的dmp文件也包含了字符集信息,dmp文件的第2和第3个字节记录了dmp文件的字符集。如果dmp文件不大,比如只有 几M或几十M,可以用UltraEdit打开(16进制方式),看第2第3个字节的内容,如0354,然后用以下SQL查出它对应的字符集:

SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;NLS_CHARSET_NAME(TO_NUMBER('0354','XXXX'----------------------------------------ZHS16GBKSQL>

如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):

cat exp.dmp | od -x | head -1 | awk '{print $2 $3}' | cut -c 3-6

然后用上述SQL语句也可以得到它对应的字符集。

注意:使用exp/imp 导入导出时是需要设定字符集的,因为它是一个客户端工具。生成的dmp文件根据客户端的字符集来定(如果你没有设置的话),这样如果导出源客户端和目标端数据库字符集不一致,imp导入就会出现乱码;而expdp/impdp工具是不依赖NLS_LANG的,它是基于源端和目标端NLS_CHARACTERSET。
3、查询oracle client端的字符集
在windows平台下,就是注册表里面相应OracleHome的NLS_LANG。还可以在dos窗口里面自己设置,比如:

set nls_lang=AMERICAN_AMERICA.ZHS16GBK

这样就只影响这个窗口里面的环境变量。
在unix平台下,就是环境变量NLS_LANG。

$echo $NLS_LANG AMERICAN_AMERICA.ZHS16GBK

如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。


4、修改oracle的字符集
一旦数据库创建后,数据库的字符集理论上讲是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集十分重要。根据Oracle的官方说明,字符集的转 换是从子集到超集受支持,反之不行。如果两种字符集之间根本没有子集和超集的关系,那么字符集的转换是不受oracle支持的。对数据库server而 言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来 说,除非万不得已,我们不建议修改oracle数据库server端的字符集。特别说明,我们最常用的两种字符集ZHS16GBK和 ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
修改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支持,不然不能startup) 按上面的做法就可以,但是可能会出现'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>SHUTDOWN immediate; SQL>startup;

如果按上面的做法做,National charset的区域设置就没有问题


修改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; TO_CH-----  354SQL>

然后将dmp文件的2、3字节修改为0354即可。
如果dmp文件很大,用ue无法打开,就需要用程序的方法了。

字符 字符集 文件 数据 数据库 子集 字节 超集 信息 方法 端的 影响 支持 之间 命令 客户 就是 工具 情况 理论 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全及信息技术 长沙晨舟网络技术有限公司 如何加强中小企业网络安全 新荣区现代化网络安全 计算机网络技术发展如何 杭州市五金erp软件开发 软件开发工程师证难考吗 网络安全正能量有哪些题 开票软件打开数据库连接失败 巨龙战神老版对应新版的服务器 数据库服务器端和客户端 公安局网络安全宣传周活动 人才库信息数据库内容 软件开发项目分配成分 服务器管理的用户和组不见了 数据库创建的索引不起作用 数据库不用外键用什么 陕西服务器维修费用 服务器可以加独立显卡么 国际服中显示连接不上服务器 asp恢复数据库 正在使用 dayz服务器找不到 我的世界服务器限制区块放置 服务器邮箱架设 福建综合软件开发厂家报价 abap 删除表数据库表 什么是软件技术(软件开发) 网络技术考核 数据库查数据速度慢怎么办 java与web软件开发哪个好
0