Oracle别名编码和扩展字符



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

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

例如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_character = al32utf8
  • nls_nchar_character = al16utf16

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

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

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

相关内容

  • 没有找到相关文章

最新更新