BYTE和CHAR在列数据types中的区别

在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个字符,无论存储每个字节需要多less字节。 一个字符可能需要多达4个字节。

一个具有11个字节的空间,另一个具有11个字符。 某些字符集(如Unicode变体)每个字符可能使用多个字节,因此根据编码,11字节字段的空间可能less于11个字符。

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

根据系统configuration的不同,字节在CHAR中的大小可能会有所不同。 在你的例子中:

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

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

我不确定,因为我不是Oracle用户,但是我认为不同之处在于使用Unicode(UTF-16/32)等多字节字符集。 在这种情况下,11个字节可能less于11个字符。

而且这些字段types在重音字符或大小写方面可能会有不同的处理方式,例如'binaryField(ete)=“été”'将不匹配,而'charField(ete)=“été”'可能(再次不确定Oracle) 。

什么版本的oracle? 一般来说,一个字符可能需要多个字节,Google是unicode。 这是一个开始:

http://www.oracle.com/technology/oramag/oracle/03-nov/o63tech_glob.html