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