使用常用的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数据库utf8使用al32utf8编码,使用cmd(gbk),分以下几种情况:
a. 设nls_lang也为zhs16gbk,则insert中文时,服务器发现客户端nls_lang为gbk,则要转换映射。输入“我靠”;因为终端为cmd,所以输入的字符集都是gbk编码的,假设“我靠”的gbk编码为0xaabb,则0xaabb要映射为utf8(假设“我靠”的utf8编码为0xccddee)编码,存入数据库,则数据中保存了utf8编码的“我靠“。然后,再使用cmd进行select查询,数据库发现nls_lang为zhs16gbk,则把”我靠“从utf8码0xccddee转为gbk的0xaabb,然后正常在cmd中显示”我靠“两字。
b. 设nls_lang也为al32utf8,则从cmd输入“我靠“时,服务器发现客服端nls_lang为utf8,则它不进行转换,直接存0xaabb进数据库;当select时,因为也不要转换,所以直接发0xaabb给终端,而0xaabb在终端cmd(gbk)里显示为“我靠”,也能正常显示。但要注意的是,这时对服务器来说,存在数据库里的内容其实是不正确的,不是正确的“我靠”的utf8编码;而只是存了个“我靠“的gbk编码。
c. 先设nls_lang为utf8,输入完“我靠“后,改nls_lang为gbk,再做select,发现显示为乱码了。这种就是前面说的因为转码问题造成的乱码。因为数据库一开始存的是”我靠“的gbk码0xaabb;然后做select时,因为使用了改为gbk的nls_lang,则数据库要进行转码了,就是要把utf8中的0xaabb转为gbk码,假设utf8中0xaabb表示的是”B??“,那就是要把”B??“转为gbk码,然后在cmd中用gbk显示了”B??“乱码。
然后,我们再次创建一个us7ascii码的数据库chr。
d. 设nls_lang为american_america.us7ascii,输入“我靠“,然后再select,发现竟然能正常显示中文。这是因为由于数据库编码和nls_lang编码一样,所以不进行转码,直接把”我靠“的gbk码0xaabb输入了数据库。而select时,由于也不要转码,所以又直接把0xaabb传了回来,在cmd(gbk)中就显示了”我靠“。
e. 延续d的情况,再设nls_lang为american_america.zhs16gbk,再做select,发现返回NR??,这种情况还是前面所说的转码造成的乱码,因为gbk是兼容ascii的,只是这里还是进行了错误的转码,因为ascii中的0xaabb转码成gbk显示,就是NR??。
f. 设nls_lang为american_america.zhs16gbk,输入“我靠“,然后再select,发现返回两个??;这是因为”我靠“的gbk编码要转码到uscii时,因为uscii里没有”我靠“两个字符的编码,所以不兼容,直接用两个?代替;而select时,因为ascii里的?和gbk里的?是兼容的,所以转码后,cmd里也显示两个?。
综上所述,可以得出如下规范:
1. 数据库字符应该至少使用gbk,最好是utf8字符集,这样至少基本上不会出现全问号乱码的情况,因为不会出现找不到对应字符,而采用?等字符代替的情况。情况f其实就是这样。
2. 应该设置nls_lang和终端使用一样的编码,这样数据库也能正确知道终端使用的编码,就能正确得转码,就不大会把错误的编码存进数据库,情况b,c,d,e就是设错了nls_lang才造成了问题。这里面,还有种情况,就是不设nls_lang时,好像oracle默认会把它当作和终端编码一样(需要确认)。
3. 尽量使得3个编码都一样,这样就能避免编码转换造成的性能损失。
其实,不仅oracle,别的一些数据库,甚至是一些编程工具,如jsp/servlet等都有类似的编码体制,基本上都是终端(如jsp里为编辑器),环境变量(jsp里为pageencoding指令),服务器端编码(jsp为浏览器等);再比如oracle做imp时,终端编码就为dmp包中的编码(不一定为原数据库编码,因为有可能它在exp时,已经转过码了),环境变量编码还是nls_lang,而服务端就是要实行imp的数据库的编码了。
有兴趣的话,大家可以研究下mysql的字符集机制,它本质上还是使用三位一体的编码机制,但划分的更细。
From:
http://tanrenjie.spaces.live.com/blog/cns!599006622366184E!343.entry
分享到:
相关推荐
根据字符集的设置情况,可以归纳出以下几种解决汉字显示异常的方法: 1. 服务器指定字符集与客户字符集不同,而与加载数据字符集一致。 解决方法:将客户端的字符集设置正确,使其与服务器端的字符集一致。 2. ...
这类问题一般发生在Oracle版本升级或重新安装系统时选择了与原来服务器端不同的字符集,而恢复加载的备份数据仍是按原字符集卸出的场合,或者加载从其他使用不同字符集的Oracle数据库卸出的数据的情况。 3. 服务器...
以下是对"Oracle的110个自带函数总结归纳"中可能涵盖的关键知识点的详细解释: 1. 数学函数: - ABS():返回绝对值。 - CEIL()和FLOOR():分别向上和向下取整。 - ROUND():四舍五入到指定的小数位数。 - MOD()...
* NVARCHAR2:Oracle 中的 NVARCHAR2 是根据字符集而定的可变长度字符串,最大长度为 4KB,而 SQL Server 中的 NVARCHAR 最大长度也为 4KB。 日期和时间数据类型 Oracle 和 SQL Server 都有 DATE 等日期和时间数据...
在此阶段,你可以设置额外的数据库选项,如字符集、临时表空间等,然后逐步完成创建过程。 **第八步:设置系统用户口令** sys和system是Oracle的内置管理员用户,需要设置强口令以确保安全。 **第九步:建立访问...
要解决这个问题,需要检查服务器端和客户端的字符集是否一致,并确保加载到 ORACLE 数据库的数据字符集与服务器指定字符集一致。此外,还需要了解 sql*net 的版本和字符集的登记方式,以便正确配置客户端的字符集。
- **根据字符集的固定长度字符串**:Oracle 有 `NCHAR` 和 `NVARCHAR2`,最大长度分别为 2KB 和 4KB;SQL Server 有 `NCHAR` 和 `NVARCHAR`,最大长度均为 4KB。 - **日期和时间类型**:两者都有 `DATE` 类型,但...
根据提供的文件信息,我们可以归纳出一系列Oracle数据库中的常用函数及其用法。这些函数涵盖了字符串处理、文本转换、格式化以及数值运算等多个方面。下面将详细解释每个函数的功能及使用场景。 ### 1. ASCII 该...
在安装时,应选择高级安装方式,并在设置中指定数据库语言为中文,字符集为GBK。这样确保数据库能够正确处理中文数据。 在安装之前,需要验证系统的硬件配置是否满足Oracle 10g的要求。至少需要512MB的RAM和1GB的...
这定义了客户端的字符集,以确保与服务器的字符集匹配,用于正确显示中文字符。 完成上述步骤后,重启PL/SQL Developer,你应该能够成功连接到Oracle数据库了。 然而,需要注意的是,如果你在安装了32位客户端后...
根据提供的文件信息,...以上就是从提供的文件信息中归纳总结出来的Oracle相关知识点。这些知识点不仅涵盖了Oracle基础理论,还涉及到了实际应用中的SQL查询技巧,对于备考Oracle大学考试以及日常学习都非常有帮助。
- **功能**:与`INSTR()`类似,但在处理双字节字符集时更准确。 - **示例**: ```sql select INSTRB('Mississippi', 'i', 3, 3) from dual; ``` #### 11. LENGTH() - **功能**:返回字符串的长度。 - **示例**:...
根据提供的文档信息,我们可以归纳出一系列关于Oracle SQL学习的关键知识点,包括SQL的基础概念、基本查询语句、函数使用、多表查询、数据处理操作、事务管理、数据定义语言(DDL)、数据操纵语言(DML)以及其他...
这是我工作中使用oracle数据库两三年中遇到的一些问题和解决办法,做了一个整理归纳,其中包括oracle数据库的数据导入、导出,面对表格文件怎样用命令快速导入oracle数据库,数据库字符集的更改,使用oracle数据库...
根据提供的文件信息,我们可以归纳出一系列与Oracle数据库操作相关的知识点。这些知识点主要涵盖了表的创建、数据插入、查询、更新及删除等基本操作,并且还包括了一些高级特性如条件筛选、字符串连接、排序以及用户...
- **5.6 更改字符集**:更改数据库使用的字符集。 - **5.7 选出记录集中第n行记录**:提取特定行的方法。 - **5.8 合并空闲块**:减少碎片化、合并空闲块以提高存储效率。 #### 应用开发 - **6.1 proc**:存储过程...
根据提供的文件信息,我们可以归纳出一系列关于Oracle数据库的关键知识点,主要涵盖了数据类型、SQL语言的基础概念、表操作、数据查询及处理等方面。以下是对这些知识点的详细解释: ### 数据类型 1. **CHAR**: ...
根据提供的文件信息,我们可以归纳出以下相关知识点: ### 一、Oracle数据库中的元数据查询 在Oracle数据库中,用户可以通过查询系统目录视图来获取关于数据库对象(如表、列等)的信息。这部分代码主要利用了`DBA...
考生需要了解如何配置NLS参数以支持特定的语言和地区设置,以及如何使用字符集来确保数据的正确显示。 ### 2. 安全配置Oracle监听器 (Securing the Oracle Listener) 监听器是Oracle数据库的关键组件之一,负责监听...
- **使用DBCA创建数据库**:通过DBCA可以指定数据库的各种属性,如字符集、表空间大小等,并可以自定义数据库模板。 - **口令管理**:涉及到数据库用户的密码管理和安全性设置。 ### 6. 管理Oracle实例 - **管理...