0

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

在此处输入图像描述

我的客户规格也是:

在此处输入图像描述

虽然(Windows 10 x64)我正在使用 sqplus,但我得到了这个(你可以在命令行顶部看到我的 NLS_LANG 环境变量):

在此处输入图像描述

我的 19c 客户端主页 regedit NLS_LANG 变量也设置为 AMERICAN_AMERICA.W8ISO8859P9。

然而,当我使用 TOAD for Oracle 时:

在此处输入图像描述

并使用 SQL Developer:

在此处输入图像描述

我很困惑。在互联网上,他们说 NLS_LANG 环境变量应该足以设置客户端字符集,但显然不是。

由于这种配置差异,我将“fıtıkçışahap”(在 sqlplus 上)视为“fıtıkçışahap”(在 SQL Developer 和 TOAD for Oracle 上)

我该如何克服这种情况?

提前致谢!

编辑:

V$NLS_PARAMETERS

在此处输入图像描述

4

2 回答 2

3

算了SELECT CLIENT_CHARSET FROM V$SESSION_CONNECT_INFO,不代表什么。

SQL Developer 基于 Java/JDBC。从 Oracle 数据库 10g 开始,NLS_LANG变量不再是 JDBC 全球化机制的一部分。JDBC 驱动程序不检查 NLS 环境。所以,设置它没有效果。

您的NLS_LANG变量设置为AMERICAN_AMERICA.W8ISO8859P9- 它在字符集方面意味着什么?

您告诉 Oracle 数据库:“我的客户端使用字符集 W8ISO8859P9”(即ISO-8859-9)——不多也不少!

当您运行 SQL*Plus 时,它会从命令行代码页继承字符集。您可以使用命令查询和修改代码页chcp。我假设它是CP857(如果您运行土耳其语 Windows)或CP850CP437(请参阅National Language Support (NLS) API Reference)。这三个代码页都不符合 ISO-8859-9,因此您的输出是乱码。

在运行 SQL*Plus 之前,相应地设置代码页,即chcp 28599(参见代码页标识符

或者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插入数据时输入了错误的值。

另请参阅OdbcConnection 将中文字符返回为“?”

于 2021-01-23T19:04:11.330 回答
0

我的 PostgreSQL 数据库的编码是 tr_TR.UTF8,所以还是 UTF8。应该是支持土耳其语字符集的拉丁语。将其更改为 tr_TR.iso8859 解决了我的问题。

于 2021-01-24T20:24:25.883 回答