2

对于 Oracle,在给定各种字符编码的情况下,是否有关于存储分配的矩阵/表格信息。

例如:

size_of_col_in(AL32UTF8) == 4 * size_of_col_in(WE8ISO8859P1)

我对那个因子值 4 感兴趣

4

1 回答 1

3

除非您只对最大变化感兴趣,否则您的示例是不正确的。

AL32UTF8 是一个可变长度字符集。一般来说,US7ASCII字符集中的任何字符都需要1个字节,欧洲字符一般需要2个字节,各种亚洲语言字符需要3个字节,少数非常稀有的字符需要4个字节。实际上,如果您正在讨论将实际的 WE8ISO8859P1 数据转换为 AL32UTF8,您通常会在实践中看到 1 和 2 之间的转换因子更接近 1 而不是 2。无需查找每个有效 WE8ISO8859P1 字符的 Unicode 映射,如果在 AL32UTF8 字符集中需要 3 或 4 个字节的存储空间,我会感到惊讶。

在 Globalization Support Guide 中有一个关于字符集的部分,它告诉您哪些字符集是单字节的,哪些是多字节的,以及哪些多字节字符集是固定宽度的。几乎所有多字节字符集都是可变宽度的,因此您要寻找的因素取决于您的数据。

在大多数情况下,你最好声明你的列使用字符长度语义而不是字节长度语义,让数据库在幕后计算要分配多少数据。例如,如果您声明一个列

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle 将为 10 个字符的存储分配空间,而不管数据库字符集如何,也不管存储该数据所需的实际字节数(受每VARCHAR2列 4000 字节的限制)。这通常使定义列大小变得更加容易,因为您不必过大列,以防有人决定将 10 个 4 字节 UTF-8 字符放入一行,并且您不必向用户解释该列将接受取决于语言和/或所选特定字符的不同字符数的字符串。

尽管定期处理全球化的 Oracle人员不鼓励这样做,但更喜欢在声明列时显式指定字符长度语义或至少仅在会话级别设置它,但您可以设置NLS_LENGTH_SEMANTICS初始化参数VARCHAR2(10)使用默认情况下,字符长度语义而不是字节长度语义(VARCHAR2(10 BYTE)如果需要字节长度语义,您仍然可以指定)。

于 2013-02-20T22:52:52.653 回答