在甲骨文,以下两者的区别是什么:
CREATE TABLE CLIENT ( NAME VARCHAR2(11 BYTE), ID_CLIENT NUMBER )
还有
CREATE TABLE CLIENT ( NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11) ID_CLIENT NUMBER )
其中一个正好有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 BYTE)
通过将字段定义为 VARCHAR2(11 CHAR),您可以告诉 Oracle 它可以使用足够的空间来存储11个字符,无论存储每个字符需要多少字节。一个字符最多可能需要4个字节。
VARCHAR2(11 CHAR)
根据系统配置的不同,用 BYTES 测量的 CHAR 的大小可能会有所不同。例如:
简单地说,当你写 NAME VARCHAR2(11 BYTE)时,只有11字节可以容纳在该变量中。
NAME VARCHAR2(11 BYTE)
例如,无论使用哪个字符集,如果使用 Unicode (UTF-16) ,那么在 NAME中只能容纳 Name 大小的一半。
NAME
另一方面,如果你写的是 NAME VARCHAR2(11 CHAR),那么不管它们的字符编码如何,NAME都可以容纳11个 CHAR。
NAME VARCHAR2(11 CHAR)
如果不指定 BYTE或 CHAR,则默认为 BYTE
BYTE
CHAR
因此,如果你编写 NAME VARCHAR2(4000 BYTE)并使用 Unicode (UTF-16)字符编码,那么在 NAME中只能容纳2000个字符
NAME VARCHAR2(4000 BYTE)
这意味着变量的大小限制是在 BYTES中应用的,它取决于该变量能容纳多少个字符的字符编码。
BYTES