SQLplus 和 Oracle,UTF-8 显示不良

SQLplus 和 Oracle,UTF-8 显示不良

我已经设定

export NLS_LANG=Italian_ITALY.UTF8

数据库采用 UTF-8

SELECT * FROM NLS_DATABASE_PARAMETERS
NLS_CHARACTERSET                                                            |AL32UTF8

但 sqlplus 显示错误ò à ì字符。

select titolo from generale where titolo like '%%Roma d%%';

TITOLO
------------------------------------------------------------
Roma drogata: la polizia non pu�� intervenire

必须是

select titolo from generale where titolo like '%%Roma d%%';

TITOLO
------------------------------------------------------------
Roma drogata: la polizia non può intervenire

我尝试过 AIX 和 Linux 客户端,全部使用 UTF-8。

我想念什么?

答案1

该问题没有提及实际的区域设置。根据 Oracle 的规定,NLS_LANG应该设置为与这些相对应。如果您的实际区域设置未使用 UTF-8,您将获得问题中所示的替换字符。

进一步阅读:

如何为 UNIX 正确设置 NLS_LANG

要指定客户端 Oracle 软件的区域设置行为,您必须设置NLS_LANG范围。它设置了客户的语言、地区和字符集。您需要检查语言环境设置来设置您的NLS_LANG第三个字段(字符集)与之一致。为此,请使用“locale”命令,如下所示:

7- 进行区域设置和 NLS_LANG需要匹配数据库字符集?
不,区域设置和NLS_LANG设置(以及 telnet/ssh 配置(如果适用))需要匹配,但它们在技术上都与数据库字符集无关,并且仅与该客户端环境相关。

答案2

您确定数据库中的文本具有正确的字符吗?换句话说,您是否验证过它在进入数据库的过程中没有被损坏?您可以通过管道传输sqlplusto的输出od -t x1z,并使用它来验证数据库是否输出正确的编码。如果编码正确,则故障出在其他地方。

您显示的设置确认数据库和 Oracle 客户端应成功设置为使用 UTF-8。然后,一旦 Oracle 客户端输出字符(例如sqlplus),它们就会由操作系统处理。

目前尚不清楚您是否已使用该locale命令来验证操作系统的区域设置 - 但我假设您已经使用过。

您是否也验证了stty设置?如果这些设置不是 8 位干净的,任何 UTF-8 字符都将在传输过程中被损坏。但它看起来也不太像这个问题:UTF-8 编码为ò0xc3 0xb2;如果最高位强制为 0,则将变为 0x43 0x32,或大写 C 和数字 2 - 都是有效的 UTF-8 字符。

接下来处理角色的是你的终端仿真器:如果您使用的是 Windows,这通常可能是 PuTTY。 PuTTY 的非常旧版本(0.62 及更早版本)默认使用 ISO-8859-1 字符集;较新版本默认使用 UTF-8,除非您特别选择其他方式并保存新的默认设置。

事实上,单曲ò被映射到字符表明您的终端模拟器未配置为 UTF-8,而是某些使用单字节字符的字符集。

ò它甚至可能被配置为期望直接 ASCII,因为它似乎用指示未知字符的符号替换了 UTF-8 的两个字节。因此,要么终端仿真器根本不需要 7 位 ASCII 集之外的字符,要么它当前使用的字体不具有与字节 0xc3 和 0xb2 相对应的字母形状(字形)。

因此,您需要在终端模拟器设置中修复两件事:

首先,您应该将其设置为 UTF-8字符集而不是当前所期望的任何内容。成功完成此操作后,该字母ò应映射到性格,不是两个。它可能是也可能不是正确的字符,但重要的是只显示一个字符,而不是两个。

如果显示的字符仍然不正确,您应该验证终端仿真器使用的字体实际上具有 的字形ò

相关内容