`
- 浏览:
622872 次
- 性别:
- 来自:
上海
-
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)。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
总之,Oracle中的VARCHAR2()和NVARCHAR2()是两种重要的字符串数据类型,它们在存储方式、字符编码和长度限制上有所区别。在数据库设计时,理解这些差异可以帮助我们做出更合适的决策,确保数据的完整性和存储效率。
3. **BYTE 和 CHAR**: 在Oracle中,VARCHAR2可以指定为字节(BYTE)或字符(CHAR)。BYTE用于存储多字节字符,如Unicode字符,而CHAR则用于单字节字符集。如果不确定字符集,通常推荐使用VARCHAR2。 4. **CHAR vs ...
- `Multibyte` 类型如 `nchar`、`NVARCHAR2`:对应 Oracle 的同名类型,用于存储多字节字符串。 6. **日期和时间类型**: - `Date` 或 `date`: 对应 Oracle 的 `DATE`,包含日期和时间的元素。 - `Time` 或 `...
在Oracle中,`VARCHAR2`可以指定为`VARCHAR2(n BYTES)`或`VARCHAR2(n CHAR)`,前者按字节计数,后者按字符计数。对于非ASCII字符集,`BYTES`可能需要更多空间。 #### §1.4 CHAR 还是 VARCHAR2 通常,选择`VARCHAR...
在Oracle中,`BYTE`数据类型与字符编码有关,它存储的是字节而非字符。一个字符可能由多个字节组成,具体取决于字符集(如UTF-8)。`CHAR`数据类型则按字符存储,不受字符集影响。 #### §1.4 CHAR 还是 VARCHAR2 ...
- 对于多字节字符类型如`NCHAR`和`NVARCHAR2`,源数据库和目标数据库必须完全相同。不支持转换、过滤和其他操作。在`MAP`和`TABLE`参数语句中,如字符串转换函数和`WHERE`子句,多字节字符可以有限制地使用。多字节...
Oracle是一种广泛使用的数据库管理系统,在企业级应用中扮演着极其重要的角色。在Oracle数据库中,数据类型的选择对于确保数据的正确存储、提高查询效率以及维护数据完整性至关重要。本文将详细介绍Oracle 10g中的...
- **NVARCHAR2(size)**:变长的字符数据类型,最大长度为`size`字符,默认和最小长度为1字符,最大长度由国家字符集定义决定,但上限为4000字节。 ##### 2. 数字型数据类型 - **NUMBER[(precision[,scale])]**:...
本文将深入探讨Oracle中的中文字符集问题,包括其基本概念、常见字符集类型以及如何在不同场景下正确配置和使用字符集。 #### 一、Oracle字符集概述 在Oracle环境中,字符集用于定义如何表示和存储字符数据。一个...
本文将详细介绍 SQL Server 中的各种数据类型及其对应的 C# 类型,并对每种类型进行解释。 #### 1. 布尔类型(Boolean) - **SQL Server**: `bit` - **C#**: `Boolean` (参考) / `bool` (值类型) - **说明**:...
`VARCHAR2` 在 Oracle 中代替 `VARCHAR`,而 `NVARCHAR2` 用于 Unicode 字符串。因此,在实际应用中,开发者需要根据所使用的数据库系统进行适当的调整。 **3. 使用 Hibernate 数据类型** 在 Hibernate 中,数据...
说明: 使用字节或码点语义来指定新列的创建, 如 char, varchar2, clob, nchar, nvarchar2, nclob 列。各种字符集对字符都有各自的定义。在客户机和服务器上使用同一字符集时, 应以该字符集所定义的字符来衡量字符串...
- `NVARCHAR2`:多字节字符集的可变长度类型,同样最大4000个字符或字节。 - `DATE`:用于存储日期和时间,固定7字节,包括日期和部分时间信息。 - `TIMESTAMP`:包含亚秒级别的日期和时间,精度可调整,默认6位...
- 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: ...