`
jinyanliang
  • 浏览: 307975 次
  • 性别: Icon_minigender_1
  • 来自: 河南开封
社区版块
存档分类
最新评论

oracle字符集及编码知识

 
阅读更多
摘要:
1,双字节字符集ZHS16GBK中,则一个中文汉字是一个字符,一个英文字母也是一个字符,所以他们俩占的存储空间一样大!
2,字符集就是一套编码规则。 eg:在字符集charset1中 A、B、? 的编码分别为 A(0001),B(0010),?(1111);
3,查看oracle 字符集 SQL> SELECT NAME,VALUE$ FROM SYS.PROPS$ WHERE NAME='NLS_CHARACTERSET';
4,查看客户端(即操作系统)的字符集 export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

六、修改了错误的字符集,oracle是怎么处理的?


两个基本原则:
在数据库端:选择需要的字符集(通过create database中的CHARACTER SET与NATIONAL CHARACTER SET子句指定);
在客户端:设置操作系统实际使用的字符集(通过环境变量NLS_LANG设置)

.



一、编码知识:

根据一个字符需要多少位字节来表示,可以把字符集分为单字节字符集和多字节字符集。其中,单字节字符集又分为7位字符集和8位字符集。单字节7位编码字符集有US7ASCⅡ,单字节8位编码字符集有符合ISO 8859-1标准规定的WE8ISO8859P1等。多字节编码又分为固定长度(长度大于或等于2)编码模式和不固定长度编码模式。多字节编码字符集中的ZHS16GBK、ZHS16CGB231280、JA16SJIS等是采用两个字节表示一个字符的字符集,又叫双字节字符集。


一个英文字母是一个字符,一个中文汉字是几个字符呢?我们知道,一个中文汉字是双字节字符,但它有几个字符与其数据库字符集有关。如果数据库字符集使用单字节US7ASCII,则一个中文汉字是二个字符;如果数据库字符集使用双字节字符集ZHS16GBK,则一个中文汉字是一个字符。一个英文字母也是用两个字节(一个字符)来表示!;在单字节字符集中,一个汉字需要两个字符,一个英文字母需要一个字符!有关这一点可以使用Oracle的函数Substr得到证明。


使用US7ASCⅡ字符集时:


Select substr('西安邮电',1,2) from dual;

语句执行结果返回 '西'。


使用ZHS16GBK字符集时:


Select substr('西安邮电',1,2) from dual;

语句执行结果返回'西安'






二、碰到的问题:

欧衡山突然跑来跟我说:他往表里面写数据写不进去了,说是超出了存储范围。建的表字段是varchar2(4000) ,往里面写的数据只有2000个英文字符,怎么就写不进去了呢?

很显然系统用了两个字节来存储一个英文字母!



分析解决问题:

SQL> SELECT NAME,VALUE$ FROM SYS.PROPS$ WHERE NAME='NLS_CHARACTERSET';


NAME                  VALUE$

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

NLS_CHARACTERSET      ZHS16GBK

说明:多字节编码字符集中的ZHS16GBK、ZHS16CGB231280、JA16SJIS等是采用两个字节表示一个字符的字符集,又叫双字节字符集。

数据库字符集使用双字节字符集ZHS16GBK,则一个中文汉字是一个字符,一个英文字母也是一个字符!

.




三、什么是字符集

字符集就是一套编码规则。 用下面的例子说明问题

在字符集charset1中 A、B、? 的编码分别为 A(0001),B(0010),?(1111);

在字符集charset2 中 A、B、? 的编码分别为 A(1001),C(1010),?(1111);

其中的数字就是给计算机看的。我们可以写一个程序实现charset1和charset2的相互转换。由于知道两个字符集的编码规则,对于demo_charset1中的0001,在转换为demo_charset2时,要将其编码改为1001;对于demo_charset1中的1111,转换为demo_charset2时,其数值不变;而对于demo_charset1中的0010,其对应的字符为B,但在demo_charset2没有对应的字符,所以从理论上无法转换,对于所有这类无法转换的情况,我们可以将它们统一转换为目标字符集中的一个特殊字符(称为“替换字符”),比如在这里我们可以将?作为替换字符,所以B就转换为了?,出现了信息的丢失;同样道理,将demo_charset2的C字符转换到demo_charset1时,也会出现信息丢失。(红色字体部分很重要,这就是我们平时碰到的乱码问题的根本原因。如果我们将汉字编码GBK转换为只有英文编码的USA7ASCII的时候,由于USA7ASCII里面没有类似例子中"B"的编码存在,所以就用"?"代替了。)
所以说,在字符集转换过程中,如果源字符集中的某个字符在目标字符集中没有定义,将会出现信息丢失。
.


四、数据库应该选择怎样的字符集


如果选错字符集会有什么麻烦

如过我们用WE8ISO8859P1或US7ASCII(美国标准字符集)来存储汉字,而这两个字符集都没有汉字编码,所以用这种字符集存储汉字信息从原则上说就是错误的。虽然在有些时候选用这种字符集好象也能正常使用,但它会给数据库的使用与维护带来一系列的麻烦!

.




五、如何修改数据库和客户端字符集

更改服务器字符集为ZHS16GBK (其实这是非常规做法,会引起很多问题)
SQL> update props$ set value$='ZHS16GBK' WHERE NAME='NLS_CHARACTERSET';
1 row updated.
SQL> COMMIT;
我们应该先将数据库export出来,然后trucate掉所有数据,修改字符集,最后import进数据!


更改客户端字符集为ZHS16GBK
# export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

NLS_LANG的格式如下:

NLS_LANG=<Language>_<Territory>.<Clients Characterset>

NLS_LANG各部分含义如下:

    Language
        -Oracle消息使用的语言
        -日期中月份和日显示

    Territory
        -货币和数字格式
        -地区和计算星期及日期的习惯

    Clients Characterset
        -控制客户端应用程序使用的字符集

.

六、修改了错误的字符集,oracle是怎么处理的

.

如果你设置了一个不存在的字符集,那么oracle重启后会自动update为缺省的字符集US7ASCII
实验过程:
list1:查看当前字符集
SQL> select value$ from props$ where name='NLS_CHARACTERSET';

VALUE$
-----
ZHS16GBK

.

lisnt2:修改字符集:
SQL> update props$ set value$='ZHENGBIN'
2 where name='NLS_CHARACTERSET';

1 row updated.

SQL> commit;

Commit complete.

.

list3:重启oracle后在警告日志里看到下面的信息

Wed Jul 22 16:01:21 2009
Updating character set in controlfile to US7ASCII
Wed Jul 22 16:01:21 2009

参考文档:

http://www.blogjava.net/zamber/archive/2006/09/25/71757.html

http://www.itpub.net/276524.html

http://www.eygle.com/archives/2006/06/dba_update_prop.html

站内:

http://hi.baidu.com/bkeep/blog/item/d9bbba88e2347cba0f244482.html

http://hi.baidu.com/bkeep/blog/item/64c308ebfaa145dad539c995.html

http://hi.baidu.com/bkeep/blog/item/ad2e10088eafef8bd1581b96.html
分享到:
评论

相关推荐

    oracle字符集查看与修改.pdf

    * 当一种字符集(字符集 A) 的编码数值包含所有另一种字符集(字符集 B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集 A 是字符集 B 的超级,或称字符集 B 是字符集 A 的子集。 2.4 数据库...

    oracle字符集快速修改注册表

    总之,Oracle字符集的正确选择和管理对于数据库的正常运行至关重要。通过快速修改注册表,我们可以便捷地在不同字符集之间切换,满足与不同数据库的兼容性需求。在日常工作中,理解并掌握字符集的相关知识,能有效...

    Oracle 字符集的查看和修改

    总的来说,理解Oracle字符集对于数据库的管理和维护至关重要。正确选择和配置字符集可以确保数据的准确性和兼容性,避免字符乱码或数据丢失的问题。在进行数据库迁移或跨语言环境操作时,对字符集的深入理解更是必不...

    熟知Oracle字符集

    ### 知识点详解:“熟知Oracle字符集” #### 引言 Oracle的多语言支持功能,尤其是字符集的管理,是确保数据正确显示和存储的关键因素。字符集问题常常成为数据库管理和应用程序开发中的一个难点,尤其是在涉及...

    ORACLE 字符集简介

    ### ORACLE 字符集简介 #### 一、字符集基本概念 **ORACLE数据库字符集**,也称为Oracle全球化支持...通过本文的介绍,希望能够帮助读者更好地理解和掌握Oracle字符集的相关知识,从而在实际应用中更加得心应手。

    Oracle_字符集的查看和修改

    Oracle 最早支持的字符集编码是 US7ASCII。 **3.2 Oracle 字符集命名规则** Oracle 字符集命名遵循以下规则:`&lt;Language&gt;&lt;bitsize&gt;&lt;encoding&gt;`,即 `&lt;语言&gt;&lt;比特位数&gt;&lt;编码&gt;`。例如,ZHS16GBK 表示 16 位简体中文 ...

    Oracle字符集研究.ppt

    本篇将深入探讨Oracle字符集的基本概念、类型以及相关知识。 首先,字符集(Character Set)是一系列字符的集合,每个字符都有其独特的编码值。Oracle最早采用的字符集是US7ASCII,它是一个单字节7位字符集,包含了...

    oracle字符集修改

    ### Oracle字符集修改知识点 #### 一、Oracle字符集概述 在Oracle数据库中,字符集是一种用于定义如何存储和处理文本数据的标准。字符集的选择对于确保数据正确显示和比较至关重要。Oracle提供了两种主要类型的...

    Linux下修改oracle字符集

    修改Oracle字符集需要一系列精确的操作步骤,并且需要数据库管理员具备一定的知识和经验。在执行字符集修改之前,首先需要通过Oracle提供的查询语句来查看当前的字符集设置。可以使用以下SQL命令来查看字符集: ```...

    Oracle字符集研究.pptx

    UTF-16是Unicode的一种编码方式,它以16位(2字节)为单位编码字符,因此AF16UTF16实际上就是基于UTF-16的Oracle字符集。 选择合适的字符集对于Oracle数据库的全球化和本地化非常重要。正确的字符集配置可以避免...

    Oracle字符集的查看和修改.pdf

    以下是关于Oracle字符集的详细知识: 1. **Oracle字符集定义**: Oracle字符集是一个字节数据的解释集合,用于确定如何将字节序列转化为可读的字符。字符集分为大小写,并存在包容关系,某些字符集是其他字符集的...

    oracle字符集查看与修改[归类].pdf

    Oracle字符集分为多个类别,包括单字节编码和多字节编码,以支持全球各种语言。 1. **Oracle字符集的定义** Oracle字符集是一个字节数据的解释集合,它有大小之分,不同的字符集之间可能存在包容关系。Oracle通过...

    oracle 字符集

    Oracle字符集是指用于表示和存储字符数据的数据编码方式。在Oracle数据库中,不同的系统环境(如服务器端和客户端)可能需要使用不同的字符集来确保数据的一致性和完整性。 **1.2 NLS_LANG环境变量解释** `NLS_...

    理解Oracle数据库字符集

    Oracle的字符集命名通常由三部分组成:语言、比特位数和编码方式,例如ZHS16GBK代表简体中文的GBK编码。 2. **字符编码方案**: - **单字节编码**:分为7位和8位两种,7位最多表示128个字符,8位可以表示256个字符...

    Oracle 12C 修改编码集

    在Oracle数据库环境中,遇到字符集问题,如表结构的comment或其他说明出现乱码,通常是由于数据库字符集与操作系统或应用程序的字符集不匹配所导致的。Oracle 12C修改编码集的步骤是为了确保数据正确显示,避免乱码...

    Oracle查看编码格式

    ### Oracle查看编码格式 在Oracle数据库管理中,正确地理解和设置字符集是非常重要的,它直接影响到数据的存储、检索和处理。...希望本文能够帮助大家更好地掌握Oracle字符集的相关知识,并在实际工作中灵活运用。

    修改oracle10字符集步骤

    本文将基于“修改oracle10字符集步骤”的标题、描述及相关内容,深入解析这一过程中的关键知识点。 ### Oracle数据库字符集理解 首先,了解Oracle数据库字符集的基本概念至关重要。字符集是用于存储和处理文本数据...

    修改PLSQL查询字符集编码为中文简体

    在IT领域,尤其是在数据库管理与开发中,字符集编码的设置是至关重要的,它直接影响到数据的正确显示和处理。特别是在使用PL/SQL进行数据库操作时,遇到乱码问题是非常常见的,这通常是因为系统默认的字符集与所处理...

Global site tag (gtag.js) - Google Analytics