Oracle 字符集编码和存储大小因子

Oracle 字符集编码和存储大小因子,oracle,character-encoding,size,Oracle,Character Encoding,Size,对于Oracle,是否有关于给定各种字符编码的存储分配的矩阵/表格信息 例如: COLU COLU in的大小(AL32UTF8)==4*COLU in的大小(WE8ISO8859P1) 我对因子值4感兴趣,除非你只对最大变化感兴趣,否则你的例子是不正确的 AL32UTF8是一个可变长度字符集。一般来说,US7ASCII字符集中的任何字符都需要1个字节,欧洲字符通常需要2个字节,各种亚洲语言字符需要3个字节,少数非常罕见的字符需要4个字节。实际上,如果您正在谈论将实际WE8ISO8859P1数据

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

例如:

COLU COLU in的大小(AL32UTF8)==4*COLU in的大小(WE8ISO8859P1)


我对因子值4感兴趣,除非你只对最大变化感兴趣,否则你的例子是不正确的

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

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

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

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


尽管Oracle人员经常处理全球化,他们更喜欢在声明列时显式指定字符长度语义,或者至少只在会话级别设置它,但是您可以将设置为cause
VARCHAR2(10)
默认情况下使用字符长度语义而不是字节长度语义(如果需要字节长度语义,您仍然可以指定
VARCHAR2(10字节)

感谢Justin的回复-是的,我对最大存储分配感兴趣,并假设没有提供“表创建级别存储语义标志”(CHAR/byte)’。谢谢你的链接()-这是一个可靠的线索,我会相应地进行。