我正在数据库访问层工作,刚刚注意到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_name
为varchar2(30 byte)
。这意味着它最多可以存储30字节的数据。您的数据库字符集是UTF-8,因此每个字符可能需要最多3字节的数据,这意味着,最坏的情况下,您可能被限制为10个字符。假设你所有的标识符都使用有效的Windows-1252字符,我认为任何字符都不需要超过2字节的存储空间。
如果您试图确定标识符是否从客户端编程语言有效
- 将标识符转换为UTF-8
- 获取UTF-8编码标识符的字节长度
- 检查字节长度是否大于30