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

在甲骨文,以下两者的区别是什么:

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

还有

CREATE TABLE CLIENT
(
NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
ID_CLIENT NUMBER
)
356922 次浏览

其中一个正好有11个字节的空间,另一个正好有11个字符的空间。某些字符集(如 Unicode 变体)可能每个字符使用多个字节,因此11字节字段的空间可能小于11个字符,这取决于编码方式。

参见 http://www.joelonsoftware.com/articles/Unicode.html

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

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

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

如果将字段定义为 VARCHAR2(11 BYTE),Oracle 最多可以使用11个字节进行存储,但实际上可能无法在字段中存储11个字符,因为有些字符需要多于一个字节来存储,例如非英语字符。

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

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

  1. 将字段限制为11BYTE
  2. 将字段限制为11个 CHAR字符


结论: 1 CHAR 不等于1 BYTE。

简单地说,当你写 NAME VARCHAR2(11 BYTE)时,只有11字节可以容纳在该变量中。

例如,无论使用哪个字符集,如果使用 Unicode (UTF-16) ,那么在 NAME中只能容纳 Name 大小的一半。

另一方面,如果你写的是 NAME VARCHAR2(11 CHAR),那么不管它们的字符编码如何,NAME都可以容纳11个 CHAR。

如果不指定 BYTECHAR,则默认为 BYTE

因此,如果你编写 NAME VARCHAR2(4000 BYTE)并使用 Unicode (UTF-16)字符编码,那么在 NAME中只能容纳2000个字符

这意味着变量的大小限制是在 BYTES中应用的,它取决于该变量能容纳多少个字符的字符编码。