修改oracle字符集
- 格式:doc
- 大小:30.00 KB
- 文档页数:4
Oracle Alter Set 语句的用法Oracle Alter Set 语句用于修改数据库的设置,包括数据库名称、字符集、时区、排序规则等。
Alter Set 语句可以单独使用,也可以与其他语句一起使用,如Create Database、Alter Database等。
语法ALTER SET <parameter> = <value>;其中,<parameter>是需要修改的设置,<value>是新的值。
常用参数参数描述DB_NAME 数据库名称CHARACTER SET 字符集TIME ZONE 时区SORT 排序规则NLS_DATE_FORMAT 日期格式NLS_TIMESTAMP_FORMAT 时间戳格式NLS_NUMERIC_CHARACTERS 数字字符SESSIONS 最大会话数PROCESSES 最大进程数COMMIT_WAIT 提交等待时间IDLE_TIME 空闲时间LOG_BUFFER 日志缓冲区大小OPEN_CURSORS 最大打开游标数SQL_TRACE SQL 追踪用法1. 修改数据库名称ALTER SET DB_NAME = 'new_database_name';2. 修改字符集ALTER SET CHARACTER SET = 'UTF8';3. 修改时区ALTER SET TIME ZONE = 'Asia/Shanghai';4. 修改排序规则ALTER SET SORT = 'BINARY';5. 修改日期格式ALTER SET NLS_DATE_FORMAT = 'YYYY-MM-DD';6. 修改时间戳格式ALTER SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS';7. 修改数字字符ALTER SET NLS_NUMERIC_CHARACTERS = ',.';8. 修改最大会话数ALTER SET SESSIONS = 1000;9. 修改最大进程数ALTER SET PROCESSES = 1000;10. 修改提交等待时间ALTER SET COMMIT_WAIT = 10;11. 修改空闲时间ALTER SET IDLE_TIME = 30;12. 修改日志缓冲区大小ALTER SET LOG_BUFFER = 10240;13. 修改最大打开游标数ALTER SET OPEN_CURSORS = 100;14. 修改 SQL 追踪ALTER SET SQL_TRACE = TRUE;注意•Alter Set 语句只能修改数据库的设置,不能修改表、视图、存储过程等对象的设置。
oracle导入出现字符集问题解决办法场景:把一台linux上的oracle库的数据捣腾到一台 windows2003上的oracle库中,在捣腾的过程中乱码了!有经验的知道多半是要改windows的注册表。
注册表打开发方式:Win98/98SE/Me运行中输入regedit.exe 无权限限制Win2000/XP1.开始>>运行.中输入regedt322.开始>>运行.中输入regedit第一种方法打开的注册表编辑器和Win98下的一样,而且功能相同,而使用第二种方法打开的注册表编辑器则可以方便的设置权限,建议网络管理员使用第2种方法打开注册表编辑器修改需要修改的权限设置部分以免被他人恶意修改。
Windows Vista/71.在开始菜单搜索框中输入regedit并按回车键.(需要管理员权限)2.在运行中输入regedit.exe(需要管理员权限)1. NLS_LANG 参数组成NLS_LANG参数由以下部分组成:NLS_LANG=<language>_<territory>.<client character set>Language:指定Oracle消息使用的语言,校验,日期中月份和日显示。
Territory:指定默认日期、数字、货币等格式,地区和计算星期及日期的习惯。
Client character set:控制客户端应用程序使用的字符集例如:NLS_LANG=AMERICAN_7ASCIIAMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集通常设置或者等于客户端(如Windows)代码页或者对于unicode应用设置为UTF8在Windows上查看当前系统的代码页可以使用chcp命令:E:\>chcp活动的代码页: 936代码页936也就是中文字符集 GBK,在Microsoft的官方站点上,我们可以遭到关于936代码页的具体编码规则,请参考以下链接:/globaldev/reference/dbcs/936.htm2. 查看 NLS_LANG 的方法Windows使用:注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\NLS_LANG查看Unix使用:env|grep NLS_LANG如:/opt/oracle>env|grep NLS_LANGNLS_LANG=AMERICAN_CHINA.ZHS16GBKWindows客户端设置,可以在注册表中更改NLS_LANG,具体键值位于:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMExx\xx指存在多个ORACLE_HOME时系统编号。
Oracle-字符集转换字符集是按照⼀定的字符编码⽅案,对⼀组特定的符号,分别赋予不同数值编码的集合。
⽇常使⽤时,服务端与客户端字符集需⼀致。
--服务端select*from nls_database_parameters;--客户端SELECT USERENV('LANGUAGE') FROM DUAL;数据库字符集调整最常⽤的是ALTER命令和完全的导出和导⼊两种。
第⼀种,ALTER DATABASE字符集语句是迁移字符集的最快⽅法,但只能在特殊情况下使⽤。
ALTER DATABASE字符集语句不执⾏任何数据转换,因此,当且仅当新字符集是当前字符集的严格超集时,才可以使⽤它。
--ALTER DATABASE字符集语句的语法如下,db_name为可选项:ALTER DATABASE[db_name]CHARACTER SET new_character_set;第⼆种,数据泵(EXPDP/IMPDP)⽅式代价较⾼,耗时且占⽤资源多,并且需要在迁移时对数据进⾏扫描,确认在迁移时是否会发⽣数据截断和字符集转换错误。
数据库字符集迁移有两个阶段:数据扫描和数据转换。
在更改数据库字符集之前,使⽤字符集扫描⼯具确定在更改数据库字符集之前所需的⼯作量。
使⽤数据泵导⼊导出脚本⽰例,脚本需在数据库服务器执⾏:--查看管理员⽬录确认导出⽂件位置路径SELECT*FROM dba_directories;--expdp导出带有条件expdp ⽤户/密码@服务名 directory=DATA_PUMP_DIR dumpfile=数据⽂件⽂件名.dmp logfile=⽇志⽂件⽂件名.log tables=导出表名 query='" where lsh in (select lsh from table_1 where code !='1' and flag='1')"' CONTENT选项可选导出结构或数据导出格式默认为.dmp--impdp导⼊导⼊时重命名存在表则增加数据主键重复数据忽略导⼊时也可以限定导⼊时所属表空间impdp ⽤户/密码@服务名 directory=DATA_PUMP_DIR dumpfile=数据⽂件⽂件名.dmp REMAP_TABLE =导出⽤户名.导出表名:导⼊表名 TABLE_EXISTS_ACTION=append data_options=skip_constraint_errors 字符集扫描⼯具 Character Set Scanner 适⽤于 Oracle Database 10g 和 Oracle Database 11g 的字符集扫描程序作为数据库软件的⼀个组件提供。
oracle 21c 修改编码要修改Oracle 21c的编码,你需要执行以下步骤:1. 连接到Oracle数据库。
你可以使用SQLPlus、SQL Developer或其他数据库管理工具连接到数据库。
2. 运行以下命令来查看当前的数据库字符集:```sqlSELECT FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';```这将返回当前数据库的字符集。
3. 如果你想要修改字符集,你需要使用`ALTER DATABASE`命令。
确保在进行任何修改之前备份数据库。
以下是一个示例,将字符集从UTF8修改为AL32UTF8:```sqlALTER DATABASE CHARACTER SET AL32UTF8;```请注意,在执行此命令之前,确保你了解目标字符集是否与当前数据兼容。
更改字符集可能会导致数据损坏或数据丢失。
4. 完成字符集修改后,运行以下命令来验证更改是否成功:```sqlSELECT FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';```这将显示修改后的字符集。
5. 如果你想要修改数据库的NLS参数,例如排序规则(NLS_SORT)或比较规则(NLS_COMP),你可以使用`ALTER DATABASE`命令进行修改。
例如:```sqlALTER DATABASE SORTING ORDER SAME ASNLS_DATABASE_PARAMETERS;ALTER DATABASE COMPATIBLE WITH RESTRICTED SINGLEBYTE;```这些命令将修改数据库的排序规则和比较规则。
6. 最后,确保重新启动数据库以使更改生效。
具体的重启方法取决于你的Oracle数据库的配置和操作系统。
修改Oracle 数据库字符集总结:修改方式大约有3种:方法一: (最安全的方法)数据库创建以后,如果需要修改字符集,通常需要重建数据库,通过导入导出的方式来转换。
方法二: (最常用的方法)通过"alter database character set ZHS16GBK;" 方式修改,但并不总是有效。
该命令在Oracle8时被引入Oracle,这个操作在本质上并不转换任何数据库字符,只是简单的更新数据库中所有跟字符集相关的信息。
(意味,你只能在新字符集是旧字符集严格超集的情况下使用这种方式转换。
)方法三: (最不安全的方法)修改SYS.props$表,使用"update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';" 方式更改字符集时候,只是修改了props$ 表,只完成了十几的十二分之一的内容,存在数据完整性的隐患。
(value$值输入了不正确的字符集,后果可能导致数据库无法启动。
)只对更改后的数据有效,即数据库中原来的数据仍以原字符集被存储。
注意:1.修改数据库字符集时必须谨慎,修改之前一定要做数据库全量备份。
(由于不能回退该项操作,因此可能会造成数据丢失或者损坏。
)2.使用"alter database character set ZHS16GBK;" 方式更改字符集时候,至少需要更改12张数据字典表;3.使用"update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';" 方式更改字符集时候,只是修改了props$ 表,只完成了十几的十二分之一的内容,存在数据完整性的隐患。
因此,更改字符集尽量使用正常的途径。
修改oracle会话字符集-概述说明以及解释1.引言1.1 概述概述部分是文章引言的一部分,在这部分中,我们介绍文章的主题和背景,总结讨论的目的和重要性。
下面是可以在概述部分中包含的内容:概述:Oracle是一种流行的关系数据库管理系统(RDBMS),被广泛用于许多企业和组织的数据管理和存储。
在Oracle数据库中,会话是与数据库建立的连接相关联的重要概念。
会话字符集是指用于存储和处理会话中的字符数据的编码集。
本文将讨论如何修改Oracle会话字符集。
会话字符集的选择在数据存储和处理过程中扮演着至关重要的角色。
正确选择和设置会话字符集可以确保数据的准确性和完整性,并且能够正确地处理各种字符集和语言。
在本文的正文部分,我们将首先介绍Oracle会话字符集的基本概念和操作原理。
然后,我们将深入讨论修改Oracle会话字符集的必要性,包括解释为什么有时需要修改会话字符集以满足特定的业务需求。
接下来,我们将详细阐述修改Oracle会话字符集的方法和步骤。
这包括在数据库级别和会话级别进行字符集的修改。
我们还会介绍一些常见的问题和注意事项,以帮助读者避免潜在的错误或数据损坏。
通过本文的阅读,读者将能够了解到修改Oracle会话字符集的重要性,并学习到正确设置和操作会话字符集的方法。
这将对数据库管理员和开发人员在处理多语言数据和跨国业务时具有重要意义。
总之,本文旨在为读者提供一个全面的指南,帮助他们理解和掌握修改Oracle会话字符集的技巧和方法。
通过正确设置和操作会话字符集,读者将能够更好地处理和管理Oracle数据库中的多语言数据,提高数据的质量和可靠性。
1.2文章结构文章结构部分内容:文章结构是指文中的章节安排和组织方式,它有助于读者理解文章的脉络和逻辑关系。
本文按照引言、正文和结论三个部分进行组织和阐述。
引言部分首先概述了修改Oracle会话字符集的背景和意义,介绍了文章的主要目的和内容。
接着,文章结构部分对整篇文章进行了简要的概述和分类,以帮助读者更好地掌握文章的框架。
最近因为一些特殊的需求,考虑到以后系统的开发,就把现有Oracle数据库的字符集gb2312改为了UTF-8步骤:1.在SQL*PLUS 中,以DBA登录conn 用户名as sysdba2.执行转换语句:SHUTDOWN IMMEDIATE;STARTUP MOUNT EXCLUSIVE;ALTER SYSTEM ENABLE RESTRICTED SESSION;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;ALTER SYSTEM SET AQ_TM_PROCESSES=0;ALTER DATABASE OPEN;ALTER DATABASE NATIONAL CHARACTER SET UTF8;ALTER DATABASE character set INTERNAL_USE ZHS16GBK;SHUTDOWN immediate;startup;注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,不然不能start)按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET whenNCLOB data exists’ 这样的提示信息要解决这个问题有两种方法一个是,利用INTERNAL_USE 关键字修改区域设置,还有一个是利用re-create,但是re-create有点复杂,所以请用internal_use,SHUTDOWN IMMEDIATE;STARTUP MOUNT EXCLUSIVE;ALTER SYSTEM ENABLE RESTRICTED SESSION;ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;ALTER SYSTEM SET AQ_TM_PROCESSES=0;ALTER DATABASE OPEN;ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8; SHUTDOWN immediate;startup;查询字符集---------set NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL16UTF16"select * from sys.props$;AL16UTF16 与UTF8可以互换声明:此方法非常危险,如造成数据库崩溃,本人概不负责。
修改oracle字符集解决:修改本地数据库的字符集更改为ZHS16GBK1,查看数据库的字符集 select * from v$nls_parameters;公司是ZHS16GBK本地是2,修改本地oracle字符集为ZHS16GBK1.cmd下,cd到oracle数据库软件的服务器端如:D:\app\Administrator\product\11.2.0\dbhome_1\BIN2.输⼊set ORACLE_SID=你想进⼊的数据库的那个sid3.输⼊ sqlplus /nolog4.将数据库启动到RESTRICTED模式下做字符集更改:SQL> conn /as sysdbaConnected.SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startup mountORACLE instance started.Total System Global Area 236000356 bytesFixed Size 451684 bytesVariable Size 201326592 bytesDatabase Buffers 33554432 bytesRedo Buffers 667648 bytesDatabase mounted.SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;System altered.SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;System altered.SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;System altered.SQL> alter database open;Database altered.SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;ALTER DATABASE CHARACTER SET ZHS16GBK*ERROR at line 1:ORA-12712: new character set must be a superset of old character set提⽰我们的字符集:新字符集必须为旧字符集的超集,这时我们可以跳过超集的检查做更改:SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK;Database altered.SQL> select * from v$nls_parameters;略19 rows selected.重启检查是否更改完成:SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startupORACLE instance started.Total System Global Area 236000356 bytesFixed Size 451684 bytesVariable Size 201326592 bytesDatabase Buffers 33554432 bytesRedo Buffers 667648 bytesDatabase mounted.Database opened.SQL> select * from v$nls_parameters;⾄此修改成功,打开navicat 却报错如下ORA-29275:partial multibyte character 解决:把本地环境变量NLS_LANG的值改成所修改的字符集格式重新打开navicat,,解决问题!。
修改Oracle数据库实例字符集Ø简介在 Oracle 中创建数据库实例后,就会有对应使⽤的编码字符集。
当我们设置的字符集与操作系统或者其他软件字符集不⼀致时,就会出现中⽂乱码等情况。
此时我们就需要修改 Oracle 数据库使⽤的字符集,下⾯是修改 Oracle 字符集的具体步骤:Oracle ⼀般使⽤以下两种字符集:1.SIMPLIFIED CHINESE_CHINA.ZHS16GBKGBK 16-bit Simplified Chinese 能够⽀持繁体中⽂,并且按照2个字符长度存储⼀个汉字。
2.SIMPLIFIED CHINESE_CHINA.AL32UTF8多字节存储,1个汉字(简体、繁体)有时采⽤3个字符长度存储。
Oracle⽀持字符集的更改,但是UTF8是Oracle中最⼤的字符集,也就是说UTF8是Z HS16GBK的严格超集。
⾸先,我们查看数据库实例所使⽤的字符集:sqlplus "/as sysdba"select userenv('language') from dual;当前(orcl)使⽤的是 CHINESE_CHINA.AL32UTF8 字符集,下⾯进⾏修改:1.运⾏ CMD2.进⼊指定数据库实例set ORACLE_SID=ORCL #"ORCL"表⽰需要修改字符集的数据库实例名3.输⼊命令sqlplus /nolog4.登录数据库conn /as sysdba5.关闭数据库实例SHUTDOWN IMMEDIATE;6.打开控制⽂件STARTUP MOUNT;7.开启限制会话模式ALTER SYSTEM ENABLE RESTRICTED SESSION;--ALTER SYSTEM DISABLE RESTRICTED SESSION; #取消限制会话模式8.设定job队列可以启动的进程数ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;说明:JOB_QUEUE_PROCESSES=0,则DBMS_JOB作业和Oracle Scheduler作业将不会在实例上运⾏。
64位oracle数据库安装和初始化字符集设置以下以安装oracle11g 为例,安装环境为win764位机器,为了减少因浏览器不兼容带来的问题,推荐使用IT。
首先分为四大步骤,一、安装oracle数据库二、安装oracle数据库客户端三、安装sql/plus开发工具四、初始化字符集设置(调试字符集乱码问题)咱们看一下详细情况:一、安装oracle数据库,从网上下载一下oracle数据库,按要求安装。
二、安装oracle数据库客户端1、下载instantclient-basic-win32-11.2.0.1.0.zip (一定得是32位的,不要下错了版本,Oracle官网有下载),将其解压至Oracle安装目录的Product下(本机命名为:instantclient_11_2):C:\oracle11g\product拷贝数据库安装根目录下的一个文件夹:C:\oracle11g\product\11.2.0\dbhome_1\NETWORK到Oracle客户端目录下C:\oracle11g\product\instantclient_11_2(其实只需要NETWORK\ADMIN\tnsnames.ora)2、设置环境变量(修改PATH和TNS_ADMIN环境变量):右击"我的电脑" - "属性" - "高级" - "环境变量" - "系统环境变量":1).选择"Path" - 点击"编辑", 把" C:\oracle11g\product \instantclient_11_2;" 加入;2).点击"新建", 变量名设置为"TNS_ADMIN", 变量值设置为" C:\oracle11g\product \instantclient_11_2;", 点击"确定";3>.点击"新建", 变量名设置为"NLS_LANG", 变量值设置为"SIMPLIFIED CHINESE_CHINA.ZHS16GBK", 点击"确定";三、安装sql/plus开发工具从网上下载PLSQL714开发工具,安装时目录选择在如图(路径不正确可能会安装不成功。
修改oracle字符集注意事项
修改Oracle字符集是一个非常重要的操作,需要特别小心和谨慎。
在进行字符集修改时,需要注意以下几个方面:
1. 数据备份,在修改字符集之前,务必对数据库进行完整备份。
这是非常重要的,因为字符集修改可能会导致数据损坏或丢失,而
备份可以在出现问题时进行恢复。
2. 数据库状态,在修改字符集之前,需要确保数据库处于正常
的状态,并且没有正在进行的重要操作。
最好在非高峰期进行字符
集修改,以避免影响数据库的正常运行。
3. 系统权限,进行字符集修改需要具有足够的权限,通常需要
使用sysdba权限或者具有ALTER DATABASE权限的用户来执行字符
集修改操作。
4. 系统空间,在进行字符集修改之前,需要确保数据库所在的
表空间有足够的空间来存储修改后的字符集数据。
字符集修改可能
会导致数据存储空间的变化,需要提前做好空间规划。
5. 数据转换,在进行字符集修改时,需要对现有数据进行转换,以确保数据能够正确地映射到新的字符集中。
这可能涉及到对表中
数据的逐个修改,因此需要谨慎对待,避免数据丢失或损坏。
6. 系统测试,在字符集修改完成后,需要对系统进行全面的测试,确保系统的各项功能和性能都没有受到影响。
特别需要测试与
字符集相关的功能,如排序、比较和检索等。
总的来说,修改Oracle字符集是一个复杂而且危险的操作,需
要在充分的准备和谨慎的态度下进行。
务必在专业人士的指导下进
行字符集修改,并且做好充分的备份和风险评估。
希望这些注意事
项能够帮助你更好地进行Oracle字符集的修改。
oracle19c修改编码在Oracle 数据库中,修改数据库编码(字符集)是一个复杂的过程,需要小心操作以确保数据的完整性。
以下是大致的步骤,但请注意在执行这些步骤之前,强烈建议在生产环境中进行充分的备份,并在非生产环境中测试这些步骤。
步骤1: 检查当前字符集在执行修改操作之前,首先检查当前数据库的字符集。
你可以使用以下查询来获取当前数据库字符集的信息:```sqlSELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET';```步骤2: 导出数据在修改字符集之前,建议将数据库中的数据导出为SQL 文件,以便在需要时进行还原。
使用`exp` 或`expdp` 工具导出数据。
```bashexp userid=your_username/your_password@your_database file=export_data.dmp```或```bashexpdp userid=your_username/your_password@your_database dumpfile=export_data.dmp```步骤3: 停止数据库在修改字符集之前,需要停止数据库服务。
步骤4: 修改字符集1. **修改`init.ora` 文件:**找到Oracle 数据库的`init.ora` 配置文件,通常位于`$ORACLE_HOME/dbs` 目录下。
编辑该文件,将`NLS_CHARACTERSET` 参数的值修改为目标字符集。
例如:```plaintextNLS_CHARACTERSET = AL32UTF8```请确保你了解目标字符集的选择,以防止数据损坏。
2. **修改`ALTER DATABASE` 命令:**在SQL*Plus 或其他管理工具中执行以下命令:```sqlSTARTUP 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 AL32UTF8; --将AL32UTF8 替换为目标字符集```步骤5: 重新编译对象执行以下脚本重新编译数据库中的所有对象:```sql@?/rdbms/admin/utl32k.sql@?/rdbms/admin/utlrp.sql```步骤6: 重建索引由于字符集的改变可能导致索引无效,重新构建索引是一个必要的步骤。
测试的时候,本机oracle安装采用了utf8字符集,而项目的要求是gbk
字符集,为了防止以后有不同字符集数据信息导入导出的问题,整理以下文档。
修改oracle字符集新装了oracle,装为AL32UTF8格式,无奈一个工程导出包是ZHS16GBK格式,想了想办法转换,以下是学习
一、什么是oracle字符集
Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。
ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。
它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
影响oracle数据库字符集最重要的参数是NLS_LANG参数。
它的格式如下:
NLS_LANG = language_territory.charset
它有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。
其中:
Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK
从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
二、如何查询Oracle的字符集
很多人都碰到过因为字符集不同而使数据导入失败的情况。
这涉及三方面的字符集,一是oracel server端的字符集,二是oracle client端的字符集;三是dmp文件的字符集。
在做数据导入的时候,需要这三个字符集都一致才能正确导入。
1、查询oracle server端的字符集
有很多种方法可以查出oracle server端的字符集,比较直观的查询方法是以下这种:SQL>select userenv(‘language’) from dual;
结果类似如下:AMERICAN _ AMERICA. ZHS16GBK (本机结果SIMPLIFIED CHINESE_CHINA.AL32UTF8)
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;
ZHS16GBK
如果dmp文件很大,比如有2G以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在unix主机上):
cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6
然后用上述SQL也可以得到它对应的字符集。
3、查询oracle client端的字符集
这个比较简单。
在windows平台下,就是注册表里面
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0\NLS_LANG 。
还可以在dos窗口里面自己设置,比如:
set nls_lang=AMERICAN_AMERICA.ZHS16GBK
这样就只影响这个窗口里面的环境变量。
在unix平台下,就是环境变量NLS_LANG。
$echo $NLS_LANG
AMERICAN_AMERICA.ZHS16GBK
如果检查的结果发现server端与client端字符集不一致,请统一修改为同server端相同的字符集。
三、修改oracle的字符集
上文说过,oracle的字符集有互相的包容关系。
如us7ascii就是
zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失。
在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。
一旦数据库创建后,数据库的字符集理论上讲是不能改变的。
因此,在设计和安装之初考虑使用哪一种字符集十分重要。
根据Oracle的官方说明,字符集的转换是从子集到超集受支持,反之不行。
如果两种字符集之间根本没有子
集和超集的关系,那么字符集的转换是不受oracle支持的。
对数据库server
而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。
一般来说,除非万不得已,我们不建议修改oracle数据库server端的字符集。
特别说明,我们最常用的两种字符集ZHS16GBK和ZHS16CGB231280之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
1、修改server端字符集(不建议使用)
在oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。
但oracle8之后,至少有三张系统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。
正确的修改方法如下:
$sqlplus /nolog
SQL>conn / as sysdba;
以上方法测试不行,用scott/tiger登陆sqlplus然后connect sys/sys 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 INTERNAL_USE ZHS16GBK; //跳过超子集检测
SQL>ALTER DATABASE national CHARACTER SET INTERNAL ZHS16GBK;
这一行不起作用,执行后出错ORA-00933: SQL 命令未正确结束,不过执行上一行命令已经生效,其他文章里未提到本行。
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP
2、修改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即可。
如果dmp文件很大,用ue无法打开,就需要用程序的方法了。
网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好,缺点是比较麻烦)。
我在windows下测试通过。
但要求oracle数据库一定要安装JVM选项。
有兴趣的朋友可以研究一下程序代码。