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
。有了这个正确的设置,您将不会像您预期的那样看到任何汉字。
我有一个小问题,我想知道两者之间的区别 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
。有了这个正确的设置,您将不会像您预期的那样看到任何汉字。