列数据类型中BYTE和CHAR之间的区别


166

在Oracle中,之间有什么区别:

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)

Answers:


265

让我们假设数据库字符集为UTF-8,这是最新版本的Oracle中推荐的设置。在这种情况下,某些字符要占用1个以上的字节才能存储在数据库中。

如果将字段定义为VARCHAR2(11 BYTE),则Oracle最多可以使用11个字节来存储,但是实际上您可能无法在该字段中存储11个字符,因为其中一些字符要占用一个以上的字节来存储,例如非英语字符。

通过VARCHAR2(11 CHAR)告诉Oracle 定义字段,无论存储每个字符需要多少字节,它都可以使用足够的空间来存储11个字符。一个字符最多需要4个字节。


55
请注意,字符长度语义不会影响的最大4000字节长度VARCHAR2VARCHAR2(4000 CHAR)如果某些字符需要多个字节的存储空间,则声明a 将允许少于4000个字符。
贾斯汀·凯夫

@David Sykes NVARCHAR(11)在语义上是否相同?
2015年

@Nap据我所知。我相信NVARCHAR类型声明中的size参数具有与VARCHAR2中相同的含义。也就是说,要确保NVARCHAR字符集中的11个字符(不是字节)有足够的存储空间,您会说NVARCHAR(11 CHAR)。注意:我实际上尚未检查。我从未使用过NVARCHAR。
David Sykes

为了进一步说明这两者之间的区别:当表示为单个字节时,可以“压缩”十六进制编码值的四个字符(即“ 0xFF”)或三个十进制字符(即“ 255”)。然后可以对位标志(最多8个设置),位操作等实用
马特·博尔哈

请注意,1作为ASCII字符(12月49日)是1001001,而1则是00000001。–
Matt Borja


17

根据系统配置,在BYTES中测量的CHAR大小可能会有所不同。在您的示例中:

  1. 限制字段​​为11 BYTE
  2. 将字段限制为11个CHAR角色


结论:1个CHAR不等于1个BYTE。


4

我不确定,因为我不是Oracle用户,但是我认为区别在于使用Unicode(UTF-16 / 32)等多字节字符集时。在这种情况下,11个字节可占不到11个字符。

同样,这些字段类型在重音字符或大小写方面可能会有所不同,例如'binaryField(ete)=“été”'可能不匹配,而'charField(ete)=“été”'可能会再次匹配(同样不确定Oracle) 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.