在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 BYTE)
通过将字段定义为 VARCHAR2(11 CHAR) ,您告诉Oracle它可以使用足够的空间来存储11个字符,无论存储每个字符需要多少字节 . 单个字符最多可能需要4个字节 .
VARCHAR2(11 CHAR)
一个具有11个字节的空间,另一个具有11个字符 . 诸如Unicode变体之类的一些字符集可能每个字符使用多个字节,因此11字节字段可能具有少于11个字符的空间,具体取决于编码 .
另见http://www.joelonsoftware.com/articles/Unicode.html
根据系统配置,BYTES中的CHAR大小可能会有所不同 . 在你的例子中:
限制字段为11 BYTE
将字段限制为11 CHAR acters
结论:1 CHAR不等于1 BYTE .
我不确定,因为我不是Oracle用户,但我认为不同之处在于使用Unicode(UTF-16/32)等多字节字符集时 . 在这种情况下,11个字节可以占不到11个字符 .
此外,对于重音字符或大小写,这些字段类型可能会有不同的处理方式,例如'binaryField(ete)=“été”'不匹配,而'charField(ete)=“été”'可能(再次不确定Oracle) .
4 回答
我们假设数据库字符集是UTF-8,这是Oracle最新版本中的推荐设置 . 在这种情况下,某些字符需要超过1个字节才能存储在数据库中 .
如果将字段定义为
VARCHAR2(11 BYTE)
,则Oracle最多可以使用11个字节进行存储,但实际上您可能无法在字段中存储11个字符,因为其中一些字符需要存储多个字节,例如:非英文字符 .通过将字段定义为
VARCHAR2(11 CHAR)
,您告诉Oracle它可以使用足够的空间来存储11个字符,无论存储每个字符需要多少字节 . 单个字符最多可能需要4个字节 .一个具有11个字节的空间,另一个具有11个字符 . 诸如Unicode变体之类的一些字符集可能每个字符使用多个字节,因此11字节字段可能具有少于11个字符的空间,具体取决于编码 .
另见http://www.joelonsoftware.com/articles/Unicode.html
根据系统配置,BYTES中的CHAR大小可能会有所不同 . 在你的例子中:
限制字段为11 BYTE
将字段限制为11 CHAR acters
结论:1 CHAR不等于1 BYTE .
我不确定,因为我不是Oracle用户,但我认为不同之处在于使用Unicode(UTF-16/32)等多字节字符集时 . 在这种情况下,11个字节可以占不到11个字符 .
此外,对于重音字符或大小写,这些字段类型可能会有不同的处理方式,例如'binaryField(ete)=“été”'不匹配,而'charField(ete)=“été”'可能(再次不确定Oracle) .