在 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
)
让我们假设数据库字符集是 UTF-8,这是最新版本的 Oracle 中推荐的设置。在这种情况下,某些字符需要超过 1 个字节才能存储在数据库中。
如果将字段定义为VARCHAR2(11 BYTE)
,Oracle 最多可以使用 11 个字节进行存储,但实际上您可能无法在字段中存储 11 个字符,因为其中一些需要超过一个字节来存储,例如非英文字符。
通过定义字段,VARCHAR2(11 CHAR)
告诉 Oracle 它可以使用足够的空间来存储 11 个字符,无论存储每个字符需要多少字节。单个字符最多可能需要 4 个字节。
一个正好有 11 个字节的空间,另一个正好有 11 个字符。某些字符集(例如 Unicode 变体)可能每个字符使用一个以上的字节,因此 11 字节字段的空间可能少于 11 个字符,具体取决于编码。
根据系统配置,以 BYTES 为单位测量的 CHAR 大小可能会有所不同。在您的示例中:
我不确定,因为我不是 Oracle 用户,但我认为不同之处在于使用多字节字符集,例如 Unicode (UTF-16/32)。在这种情况下,11 个字节可以占不到 11 个字符。
此外,这些字段类型在重音字符或大小写方面可能会受到不同的处理,例如 'binaryField(ete) = "été"' 将不匹配,而 'charField(ete) = "été"' 可能(再次不确定 Oracle) .
简而言之,当您编写时NAME VARCHAR2(11 BYTE)
,该变量中只能容纳 11 个字节。
无论您使用哪种字符集,例如,如果您使用的是 Unicode (UTF-16),那么在NAME
.
另一方面,如果您编写 NAME VARCHAR2(11 CHAR)
thenNAME
可以容纳 11 CHAR,而不管它们的字符编码如何。
BYTE
如果您不指定BYTE
或CHAR
因此,如果您编写NAME VARCHAR2(4000 BYTE)
并使用 Unicode(UTF-16) 字符编码,则只能容纳 2000 个字符NAME
这意味着应用了变量的大小限制,BYTES
并且取决于字符编码,该变量中可以容纳多少个字符。