`

oracle中有三种比较常用的类型:varchar2(byte)、varchar2(char)、nvarchar2()

 
阅读更多
   首先,我们要时刻记清:无论是varchar2还是nvarchar2,最大字节数都是4000。

         varchar2(byte):就是默认的表示方式,比如我们写成:varchar2(100),就相当于varchar2(100 byte),表示最大字节数是100,该字段最多能容纳100个字节,强调空间大小。由于我们描述的是字节,因此,保存汉字等字符时,就要小心了。如果你的数据库用的是GBK编码,那么一个汉字将占用2个字节,最多能存50个汉字,如果你的数据库用的是UTF8编码,那么一个汉字将占用3个字节,最多能存33个汉字。

         varchar2(char):表示最大字符数是100,该字段最多能容纳100个字符,强调个数。假设我们写成varchar2(100 char),那么无论是数字、字母、汉字,都看成一个字符,最多写100个,当然,汉字越多,占用的空间越大,同样遵循上边的数据库编码原则。例如:存入一个汉字,底层占2或3个字节,存入一个字母,占1个字节,绝对不是某些文章所说1个字母或数字也占2或3个字节!

         nvarchar2():没有byte、char之分,类似于varchar2(char),只不过nvarchar2()屏蔽了数据库编码,无论是何种编码,nvarchar2()中一个汉字都占两个字节。

         一般的教程,也就到这了,可是如果再多一步思考,会发现一个致命问题。

         实际应用中,很可能会出现这种写法:varchar2(1400 char),我们主观的认为,这个字段最长不能超过1400个字符,这意味着我们可能会存入1399个字符,貌似很正确的样子。

         但是,如果这1399个字符都是汉字,字符长度并没有超过1400,看起来一切正常,但实际上我们损失了一部分数据,为什么?

         因为1399个汉字,按UTF8编码来说(99%的项目都是UTF8编码吧。。),需要占用1399*3=4197个字节,而文章开篇就说,无论是什么char,最大长度就是4000字节,一个也不能多,因此多出来的197个字节,都会抹去,而整个过程中,无任何错误提示,你的数据就这样蒸发了!

         所以,对于GBK编码的数据库而言,安全的写法为:varchar2(2000 char)、nvarchar2(2000),对于UTF8编码的数据库而言,安全的写法为:varchar2(1333 char)、nvarchar2(2000)。
分享到:
评论

相关推荐

    Oralce中VARCHAR2()与NVARCHAR2()的区别介绍

    在Oracle数据库中,VARCHAR2()和NVARCHAR2()都是用于存储字符数据的变量长度数据类型,但它们之间存在显著的差异。以下是对这两个数据类型的详细解释: 1. VARCHAR2() VARCHAR2() 是Oracle中的标准可变长度字符...

    [整理版]oracle数据类型及存储方式.doc

    3. **BYTE 和 CHAR**: 在Oracle中,VARCHAR2可以指定为字节(BYTE)或字符(CHAR)。BYTE用于存储多字节字符,如Unicode字符,而CHAR则用于单字节字符集。如果不确定字符集,通常推荐使用VARCHAR2。 4. **CHAR vs ...

    PowerDesigner字段与Oracle字段对应

    - `Multibyte` 类型如 `nchar`、`NVARCHAR2`:对应 Oracle 的同名类型,用于存储多字节字符串。 6. **日期和时间类型**: - `Date` 或 `date`: 对应 Oracle 的 `DATE`,包含日期和时间的元素。 - `Time` 或 `...

    oracle数据类型及存储方式

    在Oracle中,`BYTE`数据类型与字符编码有关,它存储的是字节而非字符。一个字符可能由多个字节组成,具体取决于字符集(如UTF-8)。`CHAR`数据类型则按字符存储,不受字符集影响。 #### §1.4 CHAR 还是 VARCHAR2 ...

    oracle goldengate11支持的复制对象列表

    - 对于多字节字符类型如`NCHAR`和`NVARCHAR2`,源数据库和目标数据库必须完全相同。不支持转换、过滤和其他操作。在`MAP`和`TABLE`参数语句中,如字符串转换函数和`WHERE`子句,多字节字符可以有限制地使用。多字节...

    oracle数据类型

    Oracle是一种广泛使用的数据库管理系统,在企业级应用中扮演着极其重要的角色。在Oracle数据库中,数据类型的选择对于确保数据的正确存储、提高查询效率以及维护数据完整性至关重要。本文将详细介绍Oracle 10g中的...

    Oracle SQL基础培训

    - **NVARCHAR2(size)**:变长的字符数据类型,最大长度为`size`字符,默认和最小长度为1字符,最大长度由国家字符集定义决定,但上限为4000字节。 ##### 2. 数字型数据类型 - **NUMBER[(precision[,scale])]**:...

    oracle 中文字符集问题

    本文将深入探讨Oracle中的中文字符集问题,包括其基本概念、常见字符集类型以及如何在不同场景下正确配置和使用字符集。 #### 一、Oracle字符集概述 在Oracle环境中,字符集用于定义如何表示和存储字符数据。一个...

    SQL SERVER与C#数据类型对应表

    本文将详细介绍 SQL Server 中的各种数据类型及其对应的 C# 类型,并对每种类型进行解释。 #### 1. 布尔类型(Boolean) - **SQL Server**: `bit` - **C#**: `Boolean` (参考) / `bool` (值类型) - **说明**:...

    Hibernate中数据类型

    `VARCHAR2` 在 Oracle 中代替 `VARCHAR`,而 `NVARCHAR2` 用于 Unicode 字符串。因此,在实际应用中,开发者需要根据所使用的数据库系统进行适当的调整。 **3. 使用 Hibernate 数据类型** 在 Hibernate 中,数据...

    Oracle9i的init.ora参数中文说明

    说明: 使用字节或码点语义来指定新列的创建, 如 char, varchar2, clob, nchar, nvarchar2, nclob 列。各种字符集对字符都有各自的定义。在客户机和服务器上使用同一字符集时, 应以该字符集所定义的字符来衡量字符串...

    Oracle数据库期末复习知识点整理.docx

    - `NVARCHAR2`:多字节字符集的可变长度类型,同样最大4000个字符或字节。 - `DATE`:用于存储日期和时间,固定7字节,包括日期和部分时间信息。 - `TIMESTAMP`:包含亚秒级别的日期和时间,精度可调整,默认6位...

    Oracle sqldeveloper without jdk (win+linux)

    - Bug 4918586: National character set datatypes (NCHAR, NVARCHAR2, NCLOB) are converted to the database character set datatypes (CHAR, VARCHAR2, CLOB) in the Run PL/SQL dialog box. Workaround: ...

Global site tag (gtag.js) - Google Analytics