Oracle11g Oracle别名编码和扩展字符

Oracle11g Oracle别名编码和扩展字符,oracle11g,odp.net,Oracle11g,Odp.net,我正在研究数据库访问层,刚刚注意到Oracle11g在处理别名中的非拉丁字符时似乎存在一些问题 就30个字符的别名长度限制而言,别名中超过0x7F的字符似乎计为两个字符 例如,在Oracle SQL Developer和ODP.net中: SELECT LENGTH('ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ') "ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ" FROM DUAL 工作和报告的字符串长度为15,但是: SELECT LENGTH('ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔx') "ÔÔÔÔÔÔÔÔÔÔÔÔ

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

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

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

SELECT
 LENGTH('ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ') "ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔ"
FROM DUAL
工作和报告的字符串长度为15,但是:

SELECT
 LENGTH('ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔx') "ÔÔÔÔÔÔÔÔÔÔÔÔÔÔÔx"
FROM DUAL
报告ORA-00972:“标识符太长”错误

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

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

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

Oracle的设置如下所示:

客户:

  • NLS_LANG=英国英语。WE8MSWIN1252
数据库:

  • NLS_字符集=AL32UTF8
  • NLS\u NCHAR\u字符集=AL16UTF16

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

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

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

    所以NLS\u字符集在这里很重要。因此,对于一个通用的解决方案,我需要在代码中阅读它,并在我的C#code?中使用适当的编码@SteveH-正确。当然,这意味着您需要能够从每个Oracle字符集名称(至少是对
    NLS\U字符集
    有效的所有名称)映射到C字符集名称。除了构建自己的转换表(或在网上查找其他人的转换表),我不知道如何做到这一点。