Oracle 的 NLS_NCHAR_CHARACTERSET 和 NLS_CHARACTERSET 之间的区别

difference between NLS_NCHAR_CHARACTERSET and NLS_CHARACTERSET for Oracle

我有一个小问题,我想知道两者之间的区别 NLS_NCHAR_CHARACTERSET 和 NLS_CHARACTERSET 在 oracle 中设置 ??

根据我的理解 NLS_NCHAR_CHARACTERSET 适用于 NVARCHAR 数据类型 对于 NLS_CHARACTERSET 将用于 VARCHAR2 数据类型。

我试图在我的开发服务器上测试它,我当前的字符集设置如下:-

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               US7ASCII

然后我在数据库中插入了一些汉字值。我将字符插入到名为 data_ 的 table 中,并更新了 ADDRESS 和 ADDRESS_2 的列,它们是 VARCHAR2 列。根据我对 NLS_CHARACTERSET US7ASCII 当前设置的理解,不应支持中文字符,但它仍显示在数据库中?? NLS_NCHAR_CHARACTERSET 是否优先于此 ??

谢谢。

总的来说,你所有的观点都是正确的。 NLS_NCHAR_CHARACTERSET 定义 NVARCHAR2 等的字符集。阿尔。列而 NLS_CHARACTERSET 用于 VARCHAR2.

Why is it possible that you see Chinese characters with US7ASCII?

原因是,您的数据库字符集和客户端字符集(即参见 NLS_LANG 值)都是 US7ASCII。您的数据库使用 US7ASCII,它 "thinks" 客户端也使用 US7ASCII 发送数据。因此它不对字符串进行任何转换,数据是逐位从客户端传输到服务器,反之亦然。

因此,您可以使用 US7ASCII 实际上不支持的字符。请注意,如果您的客户端使用不同的字符集(例如,当您在 Windows 应用程序中使用 ODP.NET 托管驱动程序时),数据将是垃圾!此外,如果您考虑数据库字符集迁移,您也会遇到同样的问题。

另一个注意事项:我不认为你会得到与其他字符集相同的行为,例如例如,如果您的数据库和您的客户端都将使用 WE8ISO8859P1。另请注意,您实际上配置错误。你的数据库使用字符集 US7ASCII,你的 NLS_LANG 值也是 US7ASCII (很可能它根本没有设置,Oracle 默认它是 US7ASCII)但是真正的字符集的 SQL* 加上,resp。您的 cmd.exe 终端很可能是 CP950 or CP936

如果您想正确设置所有内容,您可以设置环境变量 NLS_LANG=.ZHT16MSWIN950(Oracle 似乎不支持 CP936)或在 运行 sqlplus.exe 之前更改您的代码页命令 chcp 437。有了这个正确的设置,您将不会像您预期的那样看到任何汉字。