2012-03-09 89 views
7

我的Oracle SQL Developer(07年1月3日),我试图与使用WE8ISO8859P1编码数据库的工作:的Oracle SQL Developer环境编码

SELECT * FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'; 

我有节约包装的问题,包含Unicode符号。当我打开先前保存的包时,所有的Unicode符号都变成了'¿'

我必须更改哪些设置才能使SQL Developer保留这些符号? 我试图设置环境编码为'ISO-8859-15'和一些其他编码,但它不会帮助。

回答

0

至少在SQL Developer中打开PKG,你可以做一个快速的尝试,看看它是否工作: -

将SQL Developer'encoding'更改为默认为更高版本的'unicode-utf-8'。

您最终需要将数据库字符集迁移到'AL32UTF8'以避免由于此字符集而导致的其他问题(如数据)。

0

如果你看一下USER_SOURCE,你会发现源代码被数据库存储/解释,将会在VARCHAR2列中使用数据库字符集。因此,您的源代码将需要在WE8ISO8859P1中。

理论上,如果客户端和数据库使用相同的字符集,那么数据库将不会尝试执行任何字符集转换,并且您可能能够潜入数据库认为是WE8ISO8859P1的字节序列中但在unicode中会有意义。但是,在某些时候,有人会使用错误的客户端,并且会中断。

你不需要代码中的标识符等unicode,所以我认为它是在字符串文字。你最好将它们存储在一个表(NVARCHAR2列)中,并将它们选入代码而不是对它们进行硬编码。如果这不可行,您可以使用UNISTR并对相关的十六进制值进行硬编码。

1

如果数据库将文本编码为非Unicode单字节编码(例如ISO-8859),则字符表中不存在的任何符号将被视为无效并由占位符替换。你不能回头,信息就会丢失。

这通常可以在存储数据时使用,但对于源代码,您无法控制Oracle如何编码字符串。

如果您的数据库被配置为使用这种编码方案,那么您可能不应该编写违反其规则的代码。