【问题标题】:Oracle Alias Encoding and Extended CharactersOracle 别名编码和扩展字符
【发布时间】:2014-07-23 10:55:09
【问题描述】:

我正在研究数据库访问层,刚刚注意到 Oracle 11g 在处理别名中的非拉丁字符时似乎存在一些问题。

就 30 个字符的别名长度限制而言,别名中超过 0x7F 的字符似乎算作两个字符。

例如在 Oracle SQL Developer 和 ODP.net 中:

SELECT
 LENGTH('ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ') "ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ"
FROM DUAL

工作并报告字符串长度为 15,但是:

SELECT
 LENGTH('ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔx') "ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔx"
FROM DUAL

报告 ORA-00972: 'identifier too long' 错误。

这似乎暗示别名字符串的编码方式意味着重音字符变成了两个字符。

这是预期的吗?有人知道这里的实际限制/编码是什么吗?

我需要一种可靠的方法来确定是否允许提供的别名字符串。

Oracle 设置的价值如下:

客户:

  • NLS_LANG = ENGLISH_UNITED KINGDOM.WE8MSWIN1252

数据库:

  • NLS_CHARACTERSET = AL32UTF8
  • NLS_NCHAR_CHARACTERSET = AL16UTF16

【问题讨论】:

    标签: oracle11g odp.net


    【解决方案1】:

    dba_tab_cols 中的column_namevarchar2(30 byte)。这意味着它最多可以存储 30 个字节的数据。您的数据库字符集是 UTF-8,因此每个字符可能需要最多 3 个字节的数据,这意味着在最坏的情况下,您可能会被限制为 10 个字符。假设您的所有标识符都使用有效的 Windows-1252 字符,我认为任何字符都不需要超过 2 个字节的存储空间。

    如果您试图从客户端编程语言中确定标识符是否有效

    • 将标识符转换为 UTF-8
    • 获取 UTF-8 编码标识符的字节长度
    • 检查字节长度是否大于30

    【讨论】:

    • 所以它的 NLS_CHARACTERSET 在这里很重要。因此,对于通用解决方案,我需要在代码中阅读它并在我的 C# 代码中使用适当的编码?
    • @SteveH - 正确。当然,这意味着您需要能够从每个 Oracle 字符集名称(至少所有对 NLS_CHARACTERSET 有效的名称)映射到 C# 字符集名称。除了建立自己的转换表(或查找其他人的在线)之外,我不知道该怎么做。
    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多