我使用 unicode char set 选项安装 oracle 11g。而且我发现我可以将 unicode 字符插入 CHAR 数据类型列。所以我的问题是:使用 unicode 选项安装 oracle 11g 时,CHAR 和 NCHAR 数据类型有什么区别?
1 回答
有两个主要区别。
长度语义的默认值。默认
CHAR(30) != NCHAR(30)
但是CHAR(30 CHAR) = NCHAR(30)
。默认长度语义(由 NLS_LENGTH_SEMANTICS 参数指定)用于 CHAR 但不用于 NCHAR。此参数的默认值为字节。NCHAR 的长度始终以字符为单位。这很重要,因为 NCHAR(30) 将始终包含 30 个 unicode 字符 - CHAR(30 CHAR) 也是如此 - 但 CHAR(30) 默认情况下仅包含 30 个字节,这可能等于也可能不等于 30 个 unicode 字符。
AL32UTF8(数据库字符集 unicode 默认值)和 AL16UTF8(NLS_NCHAR_CHARACTERSET 默认值)不等效。两者都是可变长度的 unicode 字符集,但存储字符不同,因此两者之间的存储要求有所不同,前者使用每个字符 1、2、3 有时 4 个字节,而后者使用每个字符 2 有时 4 个字节)。您的里程将根据您存储的字符而有所不同。
此外,在许多客户端应用程序和某些 Oracle 组件中,NCHAR 支持受到限制,因此如果您使用 AL32UTF8 作为数据库字符集,Oracle 的建议是坚持使用 CHAR 而根本不使用 NCHAR。