对于 Oracle,是否有关于给定各种字符编码的存储分配的矩阵/表格信息。
例如:
列大小 (AL32UTF8) == 4 * 列大小 (WE8ISO8859P1)
我对因子值 4 感兴趣
除非您只对最大变化感兴趣,否则您的示例是不正确的。
AL32UTF8 是可变长度字符集。一般来说,US7ASCII 字符集中的任何字符都将占用 1 个字节,欧洲字符通常需要 2 个字节,各种亚洲语言字符需要 3 个字节,少数非常罕见的字符将需要 4 个字节。实际上,如果您正在谈论将实际的 WE8ISO8859P1 数据转换为 AL32UTF8,那么实际上您通常会看到 1 和 2 之间的转换因子,该因子更接近 1,而不是 2。无需查找每个有效 WE8ISO8859P1 字符的 Unicode 映射,如果 AL32UTF8 字符集中需要 3 或 4 个字节的存储,我会感到惊讶。
在全球化支持指南中,有一节介绍字符集 http://docs.oracle.com/cd/E11882_01/server.112/e10729/applocaledata.htm#i635016它告诉您哪些字符集是单字节的,哪些是多字节的,以及哪些多字节字符集是固定宽度的。几乎所有多字节字符集都是可变宽度的,因此您要查找的因素将取决于您的数据。
在大多数情况下,最好将列声明为使用字符长度语义而不是字节长度语义,让数据库在幕后确定要分配多少数据。例如,如果您声明一列
CREATE TABLE foo (
col1 VARCHAR2(10 CHAR)
)
Oracle 将为 10 个字符的存储分配空间,无论数据库字符集如何,也无论存储该数据所需的实际字节数(受限于每个字符 4000 字节的限制)。VARCHAR2
柱子)。这通常会使定义列大小变得更加容易,因为如果有人决定将 10 个 4 字节 UTF-8 字符放入一行,您不必增大列的大小,并且您不必向用户解释该列将接受根据语言和/或所选的特定字符,包含不同数量的字符的字符串。
尽管定期处理全球化问题的 Oracle 人员阻止它 https://forums.oracle.com/forums/thread.jspa?messageID=9868167,更愿意在声明列时显式指定字符长度语义或至少仅在会话级别设置它,您可以设置引起VARCHAR2(10)
默认情况下使用字符长度语义而不是字节长度语义(您仍然可以指定VARCHAR2(10 BYTE)
如果你想要字节长度语义)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)