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

时间:2020-03-05 18:58:24  来源:igfitidea点击:

在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
)

解决方案

回答

一个正好有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大小可能会有所不同。在示例中:

  • 限制字段​​为11 BYTE
  • 将字段限制为11个字符

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