oracle 修改字符集为ALU32UTF8
oracleZHS16GBK的数据库导入到字符集为AL32UTF8的数据库(转载+自己经验总结)
oracleZHS16GBK的数据库导⼊到字符集为AL32UTF8的数据库(转载+⾃⼰经验总结)字符集⼦集向其超集转换是可⾏的,如此例 ZHS16GBK转换为AL32UTF8。
导出使⽤的字符集将会记录在导出⽂件中,当⽂件导⼊时,将会检查导出时使⽤的字符集设置,如果这个字符集不同于导⼊客户端的NLS_LANG设置,字符集将根据导⼊客户端NLS_LANG设置进⾏转换,如果必要,在数据插⼊数据库之前会进⾏进⼀步转换。
通常在导出时最好把客户端字符集设置得和数据库端相同,这样可以避免在导出时发⽣不必要的数据转换,导出⽂件将和数据库具有相同的字符集。
即使将来会把导出⽂件导⼊到不同字符集的数据库中,这样做也可以把转换延缓⾄导⼊时刻。
当进⾏数据导⼊时,主要存在以下两种情况:1.源数据库和⽬标数据库具有相同字符集设置这时,只需要设置NLS_LANG等于数据库字符集即可导⼊(前提是,导出使⽤的是和源数据库相同字符集,即三者相同)2.源数据库和⽬标数据库字符集不同如果我们导出时候使⽤的NLS_LANG是和源数据库相同的字符集,那么导⼊时就可以设置客户端NLS_LANG等于导出时使⽤的字符集,这样转换只发⽣在数据库端,⽽且只发⽣⼀次。
例如:如果进⾏从ZHS16GBK到UTF8的转换1)使⽤NLS_LANG=AMERICAN_AMERICA.ZHS16GBK导出数据库。
这时创建的导出⽂件包含ZHS16GBK的数据2)导⼊时使⽤NLS_LANG=AMERICAN_AMERICA.ZHS16GBK这时转换仅发⽣在insert数据到UTF8的数据库中。
含有汉字的固定字符由ZHS16GBK数据库导⼊到AL32UTF8的数据库此⽂章是对于上⼀个实验的补充,上⼀次实验仅仅考虑的 varchar2 的情况。
这次考虑到对于char类型的含有中⽂数据的情况。
对于英⽂:对英⽂,在al32utf8中仍然和zhs16gbk⼀样⽤1个字节表⽰,因此导⼊固定长度英⽂字符数据时不会出错。
ORACLE修改数据库的字符集编码为UTF-8
ORACLE修改数据库的字符集编码为UTF-81、查看数据库字符集?数据库服务器字符集:select * from nls_database_parameters,其来源于props$,是表⽰数据库的字符集。
客户端字符集环境:select * from nls_instance_parameters,其来源于v$parameter,表⽰客户端的字符集的设置,可能是参数⽂件,环境变量或者是注册表会话字符集环境select * from nls_session_parameters,其来源于v$nls_parameters,表⽰会话⾃⼰的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters⼀致。
客户端的字符集要求与服务器⼀致,才能正确显⽰数据库的⾮Ascii字符。
如果多个设置存在的时候,alter session>环境变量>注册表>参数⽂件字符集要求⼀致,但是语⾔设置却可以不同,语⾔设置建议⽤英⽂。
如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
2、修改Oracle的字符集,如下例把字符集GB2312修改为UTF-8 步骤: 1.在SQL*PLUS 中,以DBA登录 conn ⽤户名 as sysdba 2.执⾏转换语句: 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; SHUTDOWN IMMEDIATE; STARTUP;注意:如果没有⼤对象,在使⽤过程中进⾏语⾔转换没有什么影响,(切记设定的字符集必须是ORACLE⽀持,不然不能start)按上⾯的做法就可以,但是可能会出现ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data existsORA-12717: 存在 NCLOB, NCHAR 或 NVARCHAR2 数据时, 不能发出 ALTER DATABASENATIONAL CHARACTER SET 命令这样的提⽰信息要解决这个问题有两种⽅法⼀个是,利⽤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;如果按上⾯的做法做,National charset的区域设置就没有问题。
OracleEBS在编码方式为AL32UTF8时的注意事项
编码⽅式⾪属于⼀个中⽂字符所占字节说明ZHS16GBK ANSI2与所有⾪属于ANSI 的编码兼容AL32UTF8Unicode3与所有⾪属于Unicode 的编码兼容配置⽂件名称设置层配置⽂件值FND: NATIVE CLIENTENCODINGSITE UTF8ICX: Client IANA Encoding SITE Unicode (UTF-8)OracleEBS 在编码⽅式为AL32UTF8时的注意事项现如今的EBS 系统中,为了推进国际化的进程,以及系统向全球化的扩展,在Oracle 数据库的编码⽅式上渐渐从⽀持中国本⼟简体中⽂的ZHS16GBK 转向了更趋于国际化的AL32UTF8编码⽅式。
但随之⽽来在中国就会产⽣很多问题,例如:其他的外围系统仍然使⽤简体中⽂GB2312/ZHS16GBK 编码,在接⼝⽂件传输时由于编码不⼀致⽽产⽣乱码问题Excel 不兼容,简体中⽂版的Excel 在读取⽂本⽂件时采⽤的是默认的简体中⽂编码⽅式打开,所以已UTF-8编码的⽂件(如CSV ⽂件)在打开时会产⽣乱码问题所以在中国的IT 系统,⼀旦选择采⽤了AL32UTF8的国际化编码⽅式之后,了解⼀些编码⽅式的区别以及常见问题的解决⽅法是⾮常必要的。
编码⽅式这⾥就不深⼊讨论编码的知识了,简单阐述⼀下⼆者的不同之处,见如下表格:所以⼆者属于两套字符集衍⽣出来的,所以并不兼容,需要显⽰的进⾏转码才能正常显⽰。
PLSQL/SQL 客户端的配置客户端配置需要考虑Oracle Client 的所⽀持的语⾔和注册表中NLS_LANG 键值的设置。
Oracle 客户端需要安装兼容64为的32位客户端:win32_11gR2_client ,具体请从Oracle 官⽅⽹站上进⾏下载;NLS_LANG 的键值需要设置成“AMERICAN_AMERICA.AL32UTF8” 或者 “SIMPLIFIED CHINESE_CHINA.AL32UTF8”EBS 基础设置请确保⼀下表格中列⽰的配置⽂件已经设置了正确的值:当为⽂本类型输出格式设置新的打开⽅式时,请确保“Allow Native Client Encoding”已经勾选。
Oracle客户端toad汉字乱码解决方法
Oracle客户端toad汉字乱码解决方法出现中文乱码的主要原因是字符集不同。
在Oracle中,我们关心三个地方的字符集:先来查看一下数据库字符集:在Oracle中可能使用Select userenv('language') from dual;或者:Select name, value$ from props$;查看。
l Oracle服务器内部的字符集修改方法:connect sys/chang_on_installupdate props$set value$='TRADITIONAL CHINESE_TAIWAN.AL32UTF8'where name='NLS_CHARACTERSET';commit;2 NLS_LANG变量里保存的字符集这个是Oracle设置的一个变量。
在Windows中,这个变量保存在注册表中:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 保存着NLS_LANG变量。
在Unix/Linux中,则需要自己进行设置,在.profile里面加上NLS_LANG=AMERICAN_AMERICA.ZHS16GBK export NLS_LANG3 客户端应用的字符集下面是我用到的字符集american_america.AL32UTF8TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950TRADITIONAL CHINESE_TAIWAN.AL32UTF8AMERICAN_AMERICA.WE8ISO8859P1AMERICAN_AMERICA.ZHS16GBK特别注意:如果服务端编码为AL32UTF8,那么客户端就应该安装自己环境来设置字符编码。
比如我有一个服务器端,其中两个客户端一个为简体,一个为繁体:服务器端字符集设置:american_america.AL32UTF8简体客户端字符集设置:AMERICAN_AMERICA.ZHS16GBK繁体客户端字符集设置:TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950这样toad和sqlplus不论在繁体还是简体都可以正常显示汉字了。
如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量
如何设置Oracle数据库客户端字符集以及系统中的NLS_LANG环境变量概述:本地化是系统或软件运⾏的语⾔和⽂化环境。
设置NLS_LANG环境参数是规定Oracle数据库软件本地化⾏为最简单的⽅式。
NLS_LANG参数不但指定了客户端应⽤程序和Oracle数据库所使⽤的语⾔和地区;同时也指定了客户端程序输⼊数据和显⽰数据所使⽤的字符集。
本⽂主要包含如下五部分◆ NLS_LANG环境变量的构成◆ NLS_LANG环境变量的格式◆如何查看数据库NLS参数设置◆举例说明如何设置NLS_LANG环境变量◆举例说明⼀些特殊情况⼀,NLS_LANG环境变量的构成NLS_LANG环境变量由如下三部分构成:1,LANGUAGE:客户端系统所使⽤的语⾔。
指定Oracle数据库反馈的消息(例如异常信息,提⽰信息等)、字符数据的排列顺序(当指定ORDER BY时)、⽇(年⽉⽇中的天)名称,⽉名称等所使⽤的语⾔。
每个⽀持的语⾔都有唯⼀的名称。
例如,若操作系统使⽤简体中⽂,则为SIMPLIFIED CHINESE;若操作系统使⽤美式英⽂操作系统,则为AMERICAN。
LANGUAGE参数中隐含地区和字符集参数的信息。
如果没有指定LANGUAGE参数的值,则默认值为AMERICAN。
2,TERRITORY:客户端系统所在的地区。
指定默认的⽇期,货币以及数字格式。
每⼀个⽀持的地区都有唯⼀的名称。
如,CHINA,AMERICA或CANADA。
如果没有指定TERRITORY参数,则此参数的值由LANGUAGE参数推理得出。
3,CHARSET:客户端应⽤程序所使⽤的字符集。
正确地设置NLS_LANG环境变量,则使得字符数据能够在客户端字符集和数据库字符集之间正确地转换。
设置NLS_LANG不会改变客户端系统的字符集,它仅仅是让Oracle数据库知道客户端应⽤程序使⽤的是什么字符集,从⽽进⾏相应的字符集转换。
如果客户端和数据库字符集相同,则Oracle数据库忽略字符集校验,不执⾏字符集转换。
oracle 21c 修改编码
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字符集的查看查询和Oracle字符集的设置修改
Oracle字符集的查看查询和Oracle字符集的设置修改本⽂主要讨论以下⼏个部分:如何查看查询oracle字符集、修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题。
⼀、什么是Oracle字符集Oracle字符集是⼀个字节数据的解释的符号集合,有⼤⼩之分,有相互的包容关系。
ORACLE ⽀持国家语⾔的体系结构允许你使⽤本地化语⾔来存储,处理,检索数据。
它使⼯具,错误消息,排序次序,⽇期,时间,货币,数字,和⽇历⾃动适应本地化语⾔和平台。
影响数据库字符集最重要的参数是NLS_LANG参数。
它的格式如下: NLS_LANG = language_territory.charset它有三个组成部分(语⾔、地域和字符集),每个成分控制了NLS⼦集的特性。
其中:Language:指定服务器消息的语⾔,影响提⽰信息是中⽂还是英⽂Territory:指定服务器的⽇期和数字格式,Charset:指定字符集。
如:AMERICAN _ AMERICA. ZHS16GBK从NLS_LANG的组成我们可以看出,真正影响数据库字符集的其实是第三部分。
所以两个数据库之间的字符集只要第三部分⼀样就可以相互导⼊导出数据,前⾯影响的只是提⽰信息是中⽂还是英⽂。
怎么查看数据库版本select * from v$version 包含版本信息,核⼼版本信息,位数信息(32位或64位)等 ⾄于位数信息,在Linux/unix平台上,可以通过file 查看,如file $ORACLE_HOME/bin/oracle⼆、. 查看数据库字符集数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表⽰数据库的字符集。
客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter, 表⽰客户端的字符集的设置,可能是参数⽂件,环境变量或者是注册表 会话字符集环境select * from nls_session_parameters,其来源于v$nls_parameters,表⽰会话⾃⼰的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters⼀致。
修改oracle会话字符集
修改oracle会话字符集-概述说明以及解释1.引言1.1 概述概述部分是文章引言的一部分,在这部分中,我们介绍文章的主题和背景,总结讨论的目的和重要性。
下面是可以在概述部分中包含的内容:概述:Oracle是一种流行的关系数据库管理系统(RDBMS),被广泛用于许多企业和组织的数据管理和存储。
在Oracle数据库中,会话是与数据库建立的连接相关联的重要概念。
会话字符集是指用于存储和处理会话中的字符数据的编码集。
本文将讨论如何修改Oracle会话字符集。
会话字符集的选择在数据存储和处理过程中扮演着至关重要的角色。
正确选择和设置会话字符集可以确保数据的准确性和完整性,并且能够正确地处理各种字符集和语言。
在本文的正文部分,我们将首先介绍Oracle会话字符集的基本概念和操作原理。
然后,我们将深入讨论修改Oracle会话字符集的必要性,包括解释为什么有时需要修改会话字符集以满足特定的业务需求。
接下来,我们将详细阐述修改Oracle会话字符集的方法和步骤。
这包括在数据库级别和会话级别进行字符集的修改。
我们还会介绍一些常见的问题和注意事项,以帮助读者避免潜在的错误或数据损坏。
通过本文的阅读,读者将能够了解到修改Oracle会话字符集的重要性,并学习到正确设置和操作会话字符集的方法。
这将对数据库管理员和开发人员在处理多语言数据和跨国业务时具有重要意义。
总之,本文旨在为读者提供一个全面的指南,帮助他们理解和掌握修改Oracle会话字符集的技巧和方法。
通过正确设置和操作会话字符集,读者将能够更好地处理和管理Oracle数据库中的多语言数据,提高数据的质量和可靠性。
1.2文章结构文章结构部分内容:文章结构是指文中的章节安排和组织方式,它有助于读者理解文章的脉络和逻辑关系。
本文按照引言、正文和结论三个部分进行组织和阐述。
引言部分首先概述了修改Oracle会话字符集的背景和意义,介绍了文章的主要目的和内容。
接着,文章结构部分对整篇文章进行了简要的概述和分类,以帮助读者更好地掌握文章的框架。
Oracle gb2312 字符集 转 utf-8
最近因为一些特殊的需求,考虑到以后系统的开发,就把现有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数据库字符集修改的方法
ORACLE数据库字符集修改的方法ORACLE数据库有国家字符集(national character set)与数据库字符集(database character set)之分。
两者都是在创建数据库时需要设置的。
国家字符集主要是用于NCHAR、NVARCHAR、NCLOB类型的字段数据,而数据库字符集应用于:CHAR、VARCHAR、CLOB、LONG类型的字段数据;表名、列名、PL/SQL中的变量名;输入及保存在数据库的SQL和PL/SQL的源码。
具体分析:字符集修改主要有两种方法:方法一:通过逻辑备份导入导出的方法实现方法二:通过alter database set …修改以上两种两方法各有优劣,下面我们通过各自实现的方法来实现字符集的转换,来说明各自特点。
例:把当前字符集ZHS16GBK 改变成UTF8在字符集转换过程中经常会出字符长度规则不一样,这样会引起数据无法导入或者出现乱码。
我们可以通过ORACLE提供的工具检查及根据建议修改。
在SYS用户执行@?/rdbms/admin/csminst.sql脚本后:$ csscan FULL=Y FROMCHAR=ZHS16GBKfromnchar=AL32UTF8TOCHAR=UTF8 TONCHAR=UTF8 ARRAY=1024000LOG=charcheckCAPTURE=Y PROCESS=4;FROMCHAR:说明数据库CHAR, VARCHAR2, LONG,CLOB数据类型的实际字符集,缺省使用数据库的字符集。
FROMNCHAR:说明数据库NCHAR, NVARCHAR2, NCLOB数据类型的实际国家字符集,缺省使用数据库的国家字符集。
TOCHAR:指定需要转换的目标字符集。
TONCHAR:指定需要转换的目标国家字符集,如果未指定将不扫描NCHAR, NVARCHAR2, NCLOB数据类型的数据。
执行完上述指令后,检查输出charcheck.err文件并根据建议修改表段长度:User : SFEHRTable : ATMP_DEPTColumn: MEMOType : VARCHAR2(100)Number of Exceptions : 10Max Post Conversion Data Size: 130ROWID Exception Type Size Cell Data(first 30 bytes)------------------ ------------------ ----- ------------------------------AAANhYAAMAAAAA0AAg exceed column size 102 此点部于2006年7月1日由清凉点部AAANhYAAMAAAAA3ABD exceed column size 119 原来的容桂点部06年7月1日起,拆AAANhYAAMAAAAA5AAb exceed column size 116 沙田点部归属原由虎门分部直接管AAANhYAAMAAAAA5ABF exceed column size 130 2004年04月01日开始正式合併入85AAANhYAAMAAAAA8AAn exceed column size 119 大岭山点部归属莞城分部管理。
oracle修改字符集为ALU32UTF8
Variable Size 201326592 bytes
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
Database mounted.
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
Database Buffers 33554432 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
oracle修改字符集为ALU32UTF8
oracle 修改字符集 ZHS16GBK修改为AL32UTF8
oracle server 端字符集查询
selectuserenv('language') from dual
修ห้องสมุดไป่ตู้步骤如下面粗体字的命令:
SQL>
SQL> conn /as sysdba
Connected.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 236000356 bytes
Database altered.
SQL> ALTER DATABASE character set INTERNAL_USEAL32UTF8; Database altered.
oracle字符集的检查与变更
selectuserenv('language') from dual;SELECT * FROM PROPS$;NLS_CHARACTERSET AL32UTF8对于简体中文平台,缺省的字符集是:ZHS16GBK常见的中文字符集有:ZHS16CGB231280 CGB2312-80 16-bit Simplified Chinese MB, ASCII ZHS16GBK GBK 16-bit Simplified Chinese MB, ASCII, UDC其中GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。
新加坡等地也使用此编码。
GBK编码是1995年12月颁布的指导性规范。
GBK与国家标准GB 2312-80 信息处理交换码所对应的、事实上的内码标准兼容;同时,在字汇一级支持ISO/IEC 10646-1 和GB 13000-1 的全部中日韩(CJK) 汉字(20902字)。
包含了更多的编码。
但是我们说,ZHS16GBK 并非是ZHS16CGB231280的严格超集(虽然后者的汉字在前者中都存在,但是同样的编码在不同两个字符集中可能表达不同的汉字),所以在做数据库字符转换时仍然需要特别注意。
Oracle的字符集命名遵循以下命名规则:<Language><bit size><encoding>即: <语言><比特位数><编码>比如: ZHS · 16·GBK需要说明的是,有些字符集命名违背了这个规范,Oracle8/Oralce8i中的UTF-8是第一个打破这个命名规范的字符集。
我们可以看到一类字符集以AL开头,如:AL16UTF16其中AL代表ALL,指适用于所有语言(All Languages),按照这个标准当年UTF-8本应被命名为AL24UTF8。
Oracle字符集问题
使用常用的gbk,utf8以及ascii说明(oracle中对应hs16gbk,al32utf8,us7ascii)。
其中,ascii为经典的单字节编码,采用7位,只能表示128个常用字符以及计算机控制字符,不能显示中文等字符;gbk为中国大陆标准,16位,简体中文字符集标准;utf8为unicode 的一种最常用实现,兼容ascii的字符使用1位,其余字符都采用3位,可以表示任何字符。
Utf8其实已经可以称为国际标准字符集编码,应首先考虑使用utf8。
需要说明的是,虽然gbk跟utf8都能表示中文字符,但每个字符的编码是不一样的,所以不能认为是兼容的。
其实,oracle的字符系统很简单,主要由3部分组成:客户终端字符集,nls_lang环境变量字符集,数据库使用的字符集。
其中,客户终端各种各样,比如windows下cmd,unix/linux下terminal/console,甚至如toad等工具也可以视为一个终端。
我们使用windows cmd举例说明,cmd使用了gbk编码(好像不能修改)nls_lang环境变量决定了终端与服务器连接时,要不要转换字符集,如果nls_lang和服务器端数据库使用的编码不一样,那就要进行转码;如果设为一样,就不会发生转码。
比如一个终端cmd查询一张数据库表,而其nls_lang设为american_america.zhs16gbk,而数据库为american_america.al32utf8,则数据库中的数据传到终端时,首先要进行utf8到gbk的转码。
而转码又有两种情况,a.就是一个字符在两中编码里都有,就是具体的码文不一样;b.转码时发现一个字符在另一种编码里没有,则直接用替代字符代替,而这一般就是…?‟字符了。
这里要注意的是,我们一般所说的乱码有2种,一种就是b所说的…?‟,而另一种出现的奇奇怪怪的字符就是由于nls_lang设置等转码原因造成的。
而数据库使用的字符集就是数据库实际使用的字符集。
oracle查看字符集后修改oracle服务端和客户端字符集的步骤
oracle查看字符集后修改oracle服务端和客户端字符集的步骤1.复制代码代码如下:select userenv('language') from dual;:将数据库启动到RESTRICTED模式下做字符集更改:复制代码代码如下:SQL>conn /as sysdbaSQL>shutdown immediate;SQL>startup mountSQL>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;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;SQL>select * from v$nls_parameters;重启检查是否更改完成:复制代码代码如下:SQL>shutdown immediate;SQL>startupSQL>select * from v$nls_parameters;我们看到这个过程和之前ALTER DATABASE CHARACTER SET操作的内部过程是完全相同的,也就是说INTERNAL_USE 提供的帮助就是使Oracle数据库绕过了⼦集与超集的校验这⼀⽅法在某些⽅⾯是有⽤处的,⽐如测试;应⽤于产品环境时⼤家应该⼩⼼,可能会有⼀些意外的问题。
orcale 乱码原因与解决方法
解决方法1、insert之前先设定nls_lang环境变量为中文,然后再插入中文数据export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"orexport NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS32GB18030"如果这样后,反而插不进去,或者仍然为乱码,表示当初再建库时,没有选择中文字符集(export NLS_LANG=AMERICAN_AMERICA.AL32UTF8)2、dbca一个新库,在字符集处选择中文3、强行修改服务器端ORACLE当前字符集(此方法没有试过,但应该是要在安装db的时候已经安装了此字符集,属猜测)在用cmp命令加载数据前,先在客户端用sql*plus登录system DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改:SQL >; create database character set US7ASCII1.* create database character set US7ASCII2.ERROR at line 1:3.ORA-01031: insufficient privileges你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上ORACLE数据库的字符集已被强行修改为US7ASCII,接着用cmp命令装载数据。
等数据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE数据库,在sql>;命令提示符下,运行select * from V$NLS_PARAMETERS,可以看到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正确显示。
4、利用数据格式转储,避开字符集限制这种方法主要用于加载外来ORACLE数据库的不同字符集数据。
【Oracle】修改oracle数据库的字符集
【Oracle】修改oracle数据库的字符集由于安装Oracle数据库时未勾选正确的字符集,导致数据库的字符集与我们需要的不⼀样,我们可以通过如下步骤来修改。
1、查出oracle server 端当前的字符集select userenv('language') from dual查询结果中NLS_CHARACTERSET为server端字符集,NLS_LANGUAGE 为 server端字符显⽰形式。
2、修改 server端字符集下⾯将Oracle数据库的字符集改为ZHS16GBK将数据库启动到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;略19 rows selected.参考博⽂:。
Oracle12.2新特性PDB不同字符集变更
Oracle12.2新特性PDB不同字符集变更在oracle12.1版本中,同⼀CDB中的所有PDB使⽤的都是相同的字符集,并且Plug-in时PDB也要和⽬标CDB相同字符集或者是⼦集,否则plug-in时会失败在PDB_PLUG_IN_VIOLATIONS视图提⽰,这样影响了PDB的迁移灵活性,在MOS Note 1968706.1摘录从 12.2 开始,同⼀个 cdb 中的各个 PDB 字符集可以不相同。
Per-PDB Character Set的有⼏个前提条件:1) CDB must be AL32UTF82) Application Container requires single character set3) National character set also supported per PDB4) Truncation of data can occur in cross-container queries if data conversion to UNICODE causes expansion对于最新版本 12.2.0.1 ,在新创建 PDB 时并没有办法指定 PDB 的字符集,因此只能和 root 容器字符集相同。
⽬前没有提供创建PDB指定字符集的选项。
可以通过以下⽅式实现:a. ⽽不同 PDB 可以使⽤ hot clone,b. Relocate PDB online ⽅式直接 plug-inc. 可使⽤内部转换字符集( internal_use) 进⾏转换d. 使⽤12 DMU ⼯具下⾯将对前⾯种⽅式进⾏演⽰:A. 热克隆a. ⽬标端数据库使⽤dbca创建容器数据库,默认cdb默认字符集是AL32UTF8,源库能为任意字符集b.源环境与⽬标环境平台有相同的字节序(endianness)c.源库和⽬标库都为归档模式 ; archive log list ;d.源库和⽬标库都使⽤LOCAL UNDO ; select * from database_properties where property_name='LOCAL_UNDO_ENABLED';alter session set container=cdb$root;shu immediate ;startup mount ;alter database archivelog ; #改归档startup upgrade ;alter database local undo on ; #改本地UNDOshu immediate ;startup ;1.源库,给SYSTEM 授创建PDB的权限grant create pluggable database to system ;2. ⽬标库创建public dblink,连接到源库,并测试create public database link cdbgbk_link connect to c##adm identified by cloneadmin using'cdbgbk';select sysdate from dual@cdbgbk_link ;3. ⽬标库修改file_name_convertalter session set pdb_file_name_convert = '/oracle/app/oradata/cdbgbk/pdbgbk','/oracle/app/oradata/cdbgbk/pdb_gbk' ;4. ⽬标库通过dblink 克隆PDB,并检查PDB状态CREATE PLUGGABLE DATABASE PDB_GBK FROM PDBGBK@cdbgbk_link;select name ,con_id , open_mode from v$pdbs ;5 .打开PDBalter session set container=pdb_gbk ;alter database open ;show con_name ;select value from nls_database_parameters where parameter ='NLS_CHARACTERSET';B .relocate原理热克隆+redo应⽤准备条件同热克隆克隆时源库可处于read write状态⽬标库Create PDB完成,源库dml事务仍可继续⽬标PDB open时源库中⽌会话并同步redo(或归档数据)源端应⽤undo数据回滚源库PDB会话⾃动切换到⽬标端克隆语句使⽤AVALIABLITY选项nomal|high|max1.⽬标库修改file_name_convertalter session set pdb_file_name_convert = '/oracle/app/oradata/cdbgbk/pdbgbk','/oracle/app/oradata/cdbgbk/pdb_gbk' ;2.relocate,relocate过程中,理论上连接原库PDBGBK的dml事务并不中断。