我使用19c客户端和数据库的NLS参数,如下所示:

我的客户规格还包括:

当(Windows10 x64)我使用sqplus时,我得到了这个(你可以在命令行的顶部看到我的NLS_LANG环境变量):

我的19c客户端home regedit NLS_LANG变量也设置为AMERICAN_AMERICA.W8ISO8859P9。
然而,当我使用TOAD for Oracle时:

并使用SQL Developer:

我搞糊涂了。在互联网上,他们说NLS_LANG环境变量应该足以设置客户端字符集,但显然不是。
由于这种配置差异,我将“fıtıkçışahap”(在sqlplus上)视为“f‘tät kçŸahap”(在SQL Developer和TOAD for Oracle上)。
我该如何克服这种情况呢?
提前感谢!
编辑:
V$NLS_PARAMETERS

发布于 2021-01-25 04:24:26
我的PostgreSQL数据库的编码是tr_TR.UTF8,所以仍然是UTF8。它应该是支持土耳其字符集拉丁语。把它改成tr_TR.iso8859解决了我的问题。
发布于 2021-01-24 03:04:11
忘了SELECT CLIENT_CHARSET FROM V$SESSION_CONNECT_INFO吧,它没有任何意义。
SQL Developer基于Java/JDBC。从Oracle Database 10g开始,NLS_LANG变量不再是JDBC全球化机制的一部分。JDBC驱动程序不检查NLS环境。因此,设置它不会有任何影响。
您的NLS_LANG变量设置为AMERICAN_AMERICA.W8ISO8859P9 -从字符集的角度来看,这意味着什么?
你告诉Oracle数据库:“我的客户使用字符集W8ISO8859P9”(即ISO-8859-9) --不多也不少!
当您运行SQL*Plus时,它将从命令行代码页继承字符集。您可以使用chcp命令查询和修改代码页。我假设它要么是CP857 (如果你运行的是土耳其视窗),要么是CP850或CP437 (请参阅National Language Support (NLS) API Reference)。这三个代码页都不匹配ISO-8859-9,因此您的输出是胡言乱语。
在运行SQL之前,请设置相应的代码页,即chcp 28599 (请参阅Code Page Identifiers)
或者,根据您的代码页设置NLS_LANG,例如AMERICAN_AMERICA.TR8PC857 (与SELECT VALUE AS ORACLE_CHARSET, UTL_I18N.MAP_CHARSET(VALUE) AS IANA_NAME FROM V$NLS_VALID_VALUES WHERE PARAMETER = 'CHARACTERSET'核对)
通常TOAD处理字符集非常智能,所以我担心您在TOAD中看到的胡言乱语是数据库中的真实数据,也就是说,它是垃圾数据,因为在插入数据时,您的NLS_LANG值是错误的。
https://stackoverflow.com/questions/65861426
复制相似问题