Oracle别名编码和扩展字符

时间:2014-06-03 07:34:35

标签: oracle11g odp.net

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

它认为,就别名而言,超过0x7F的字符在30字符别名长度限制方面似乎算作两个字符。

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

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

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

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

报告ORA-00972:'标识符太长'错误。

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

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

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

Oracle的设置如下:

客户端:

  • NLS_LANG = ENGLISH_UNITED KINGDOM.WE8MSWIN1252

数据库:

  • NLS_CHARACTERSET = AL32UTF8
  • NLS_NCHAR_CHARACTERSET = AL16UTF16

1 个答案:

答案 0 :(得分:0)

column_name中的

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

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

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