字符集编码和存储大小因素

时间:2013-02-20 22:35:00

标签: oracle character-encoding size

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

例如:

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

我对那个因素值感兴趣4

1 个答案:

答案 0 :(得分:2)

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

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

在全球化支持指南中,有一节关于character sets,它告诉您哪些字符集是单字节的,哪些是多字节的,哪些多字节字符集是固定宽度的。几乎所有的多字节字符集都是可变宽度的,因此您要查找的因素将取决于您的数据。

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

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

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

虽然Oracle人员定期处理全球化问题discourage it,但是在声明列时或者至少只在会话级别设置时,更喜欢明确指定字符长度语义,可以设置NLS_LENGTH_SEMANTICS initialization parameter使VARCHAR2(10)默认使用字符长度语义而不是字节长度语义(如果需要字节长度语义,仍然可以指定VARCHAR2(10 BYTE)。)