gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:10:09 25 4
gpt4 key购买 nike

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

例如:

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

我对那个因子值 4 感兴趣

最佳答案

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

AL32UTF8 是一个变长字符集。一般而言,US7ASCII字符集中的任何字符都需要1个字节,欧洲字符通常需要2个字节,各种亚洲语言字符需要3个字节,少数非常罕见的字符需要4个字节。实际上,如果您正在谈论将实际 WE8ISO8859P1 数据转换为 AL32UTF8,您通常会在实践中看到 1 和 2 之间的转换因子,它比 2 更接近 1。无需查找每个有效 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 ,更喜欢在声明列时明确指定字符长度语义或至少仅在 session 级别设置它,您可以设置 NLS_LENGTH_SEMANTICS initialization parameter导致 VARCHAR2(10)默认情况下使用字符长度语义而不是字节长度语义(如果你想要字节长度语义,你仍然可以指定 VARCHAR2(10 BYTE))。

关于oracle - 字符集编码和存储大小因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14991238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com