我已经设定
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
您确定数据库中的文本具有正确的字符吗?换句话说,您是否验证过它在进入数据库的过程中没有被损坏?您可以通过管道传输sqlplus
to的输出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字符集而不是当前所期望的任何内容。成功完成此操作后,该字母ò
应映射到一性格,不是两个。它可能是也可能不是正确的字符,但重要的是只显示一个字符,而不是两个。
如果显示的字符仍然不正确,您应该验证终端仿真器使用的字体实际上具有 的字形ò
。