ChatGPT解决这个技术问题 Extra ChatGPT

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

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

J
Jon Heller

让我们假设数据库字符集是 UTF-8,这是最新版本的 Oracle 中推荐的设置。在这种情况下,某些字符需要超过 1 个字节才能存储在数据库中。

如果您将字段定义为 VARCHAR2(11 BYTE),Oracle 最多可以使用 11 个字节进行存储,但您实际上可能无法在字段中存储 11 个字符,因为其中一些需要超过一个字节来存储,例如非英文字符。

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


请注意,字符长度语义不会影响 VARCHAR2 的 4000 字节最大长度。如果某些字符需要多个字节的存储空间,则声明 VARCHAR2(4000 CHAR) 将允许少于 4000 个字符。
@David Sykes 这在语义上与 NVARCHAR(11) 相同吗?
@Nap 据我所知不是。我相信 NVARCHAR 类型声明中的 size 参数与 VARCHAR2 中的含义相同。即,为了确保 NVARCHAR 字符集中的 11 个字符(不是字节)有足够的存储空间,您会说 NVARCHAR(11 CHAR)。注意:我实际上没有检查过这个。我从未使用过 NVARCHAR。
为了进一步说明两者之间的区别:十六进制编码值的四个字符(即“0xFF”)或三个十进制字符(即“255”)在表示为单个字节时可以“压缩”:11111111。然后可以对位标志(最多 8 个设置)、按位运算等很有用。
请注意,作为 ASCII 字符(dec. 49)的 1 是 1001001,而作为位的 1 是 00000001。
M
Matthias Kestenholz

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

另请参阅http://www.joelonsoftware.com/articles/Unicode.html


u
user15453

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

将字段限制为 11 个字节 将字段限制为 11 个字符


S
Seldaek

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

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


A
Aman Singh Rajpoot

简而言之,当您编写 NAME VARCHAR2(11 BYTE) 时,该变量中只能容纳 11 个字节。

无论您使用哪种字符集,例如,如果您使用 Unicode (UTF-16),那么 NAME 中只能容纳 Name 的一半大小。

另一方面,如果您编写 NAME VARCHAR2(11 CHAR),那么 NAME 可以容纳 11 个 CHAR,而不管它们的字符编码如何。

如果您不指定 BYTECHAR,则 BYTE 是默认值

因此,如果您编写 NAME VARCHAR2(4000 BYTE) 并使用 Unicode(UTF-16) 字符编码,那么 NAME 中只能容纳 2000 个字符

这意味着变量的大小限制在 BYTES 中应用,并且取决于字符编码,该变量中可以容纳多少字符。