甲骨文 Client_charset
Oracle Client_charset
我正在使用 19c 客户端和我的数据库的 NLS 参数如下:
我的客户规格也是:
虽然 (Windows 10 x64) 我正在使用 sqplus,但我得到了这个(你可以在命令行顶部看到我的 NLS_LANG 环境变量):
我的 19c 客户端主目录 regedit NLS_LANG 变量也设置为 AMERICAN_AMERICA.W8ISO8859P9.
然而,当我使用 TOAD for Oracle 时:
并使用 SQL 开发者:
我很困惑。在 Internet 上,他们说 NLS_LANG 环境变量应该足以设置客户端字符集,但显然不是。
由于这种配置差异,我将“fıtıkçışahap”(在 sqlplus 上)视为“fıtıkÃ§Ä±Åşahap”(在 SQL Developer 和 TOAD for Oracle 上)
我该如何克服这种情况?
提前致谢!
编辑:
V$NLS_PARAMETERS
忘记SELECT CLIENT_CHARSET FROM V$SESSION_CONNECT_INFO
,它不代表任何东西。
SQL 开发人员基于 Java/JDBC。从 Oracle 数据库 10g 开始,NLS_LANG
变量不再是 JDBC 全球化机制的一部分。 JDBC 驱动程序不检查 NLS 环境。所以,设置它是没有效果的。
您的 NLS_LANG
变量设置为 AMERICAN_AMERICA.W8ISO8859P9
- 这在字符集方面意味着什么?
您告诉 Oracle 数据库:“我的客户端使用字符集 W8ISO8859P9”(即 ISO-8859-9)- 不多也不少!
当你 运行 SQL*Plus 然后它从命令行代码页继承字符集。您可以使用命令 chcp
查询和修改代码页。我假设它是 CP857 (if you run a Turkish Windows) or CP850 or CP437 (see 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
值已插入。
另见
我的 PostgreSQL 数据库的编码是 tr_TR.UTF8,所以仍然是 UTF8。应该是支持土耳其语字符集的 LATIN。将其更改为 tr_TR.iso8859 解决了我的问题。
我正在使用 19c 客户端和我的数据库的 NLS 参数如下:
我的客户规格也是:
虽然 (Windows 10 x64) 我正在使用 sqplus,但我得到了这个(你可以在命令行顶部看到我的 NLS_LANG 环境变量):
我的 19c 客户端主目录 regedit NLS_LANG 变量也设置为 AMERICAN_AMERICA.W8ISO8859P9.
然而,当我使用 TOAD for Oracle 时:
并使用 SQL 开发者:
我很困惑。在 Internet 上,他们说 NLS_LANG 环境变量应该足以设置客户端字符集,但显然不是。
由于这种配置差异,我将“fıtıkçışahap”(在 sqlplus 上)视为“fıtıkÃ§Ä±Åşahap”(在 SQL Developer 和 TOAD for Oracle 上)
我该如何克服这种情况?
提前致谢!
编辑:
V$NLS_PARAMETERS
忘记SELECT CLIENT_CHARSET FROM V$SESSION_CONNECT_INFO
,它不代表任何东西。
SQL 开发人员基于 Java/JDBC。从 Oracle 数据库 10g 开始,NLS_LANG
变量不再是 JDBC 全球化机制的一部分。 JDBC 驱动程序不检查 NLS 环境。所以,设置它是没有效果的。
您的 NLS_LANG
变量设置为 AMERICAN_AMERICA.W8ISO8859P9
- 这在字符集方面意味着什么?
您告诉 Oracle 数据库:“我的客户端使用字符集 W8ISO8859P9”(即 ISO-8859-9)- 不多也不少!
当你 运行 SQL*Plus 然后它从命令行代码页继承字符集。您可以使用命令 chcp
查询和修改代码页。我假设它是 CP857 (if you run a Turkish Windows) or CP850 or CP437 (see 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
值已插入。
另见
我的 PostgreSQL 数据库的编码是 tr_TR.UTF8,所以仍然是 UTF8。应该是支持土耳其语字符集的 LATIN。将其更改为 tr_TR.iso8859 解决了我的问题。