在 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个字符,因为其中一些字符需要超过1个字节来存储,例如非英文字符。

通过将字段定义为 VARCHAR2(11 CHAR) 你告诉 Oracle 它可以使用足够的空间来存储 11 个字符,无论存储每个字符需要多少字节。单个字符最多可能需要 4 个字节。

其他提示

一个正好有 11 个字节的空间,另一个正好有 11 个字符的空间。某些字符集(例如 Unicode 变体)每个字符可能使用多个字节,因此 11 字节字段的空间可能少于 11 个字符,具体取决于编码。

也可以看看 http://www.joelonsoftware.com/articles/Unicode.html

根据系统配置,以字节为单位测量的 CHAR 大小可能会有所不同。在你的例子中:

  1. 将字段限制为 11 字节
  2. 将字段限制为 11 字符演员


结论:1 CHAR 不等于 1 BYTE。

我不确定,因为我不是 Oracle 用户,但我认为差异在于使用多字节字符集(例如 Unicode (UTF-16/32))时。在这种情况下,11 个字节可能少于 11 个字符。

此外,这些字段类型在重音字符或大小写方面可能会受到不同的处理,例如 'binaryField(ete) = "été"' 将不匹配,而 'charField(ete) = "été"' 可能会匹配(再次不确定 Oracle) 。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top