我需要一个通用的PL / SQL代码,用于将特殊字符转换为标准ASCII字符,如下所示: - ÜNLÜ - > UNLU,JÓNÁS-JONAS等

问题描述 投票:-1回答:1

尝试使用脚本,但特殊字符变为问号。

sql oracle replace ascii special-characters
1个回答
1
投票

感谢@Wernfried Domscheit在我的回答中指出了可能导致它无法为您工作的缺陷。我现在编辑了我的答案来解决这些问题。

首先,为了查看和输入重音字符,您需要让客户端系统在支持这些字符的字符集中工作。 US ASCII 7位不支持重音字符。 (解释here。)

UTF-8现在是互联网上最受欢迎的字符集,并且在商业系统中变得越来越流行,因为它确实支持地球上的每个角色系统。支持重音字符的其他字符集包括Windows-12xx系列和ISO-8859系列。如果您可以告诉我们有关客户端系统(Windows?Mac?UNIX?)以及用于访问数据库的应用程序的更多信息,我们可以更具体。

我可以重现你的问题的症状,并在我的情况下解决它。

首先,我检查服务器字符集:

select * from nls_database_parameters where parameter like '%CHARACTERSET%';

PARAMETER              VALUE
---------------------- ----------
NLS_CHARACTERSET       AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16

所以varchar2列将在我的服务器上以UTF-8编码。

我在Linux上使用$ LANG = en.US.UTF-8在我的客户端上运行Oracle。我可以通过定义$ NLS_LANG(对于客户端)来使用ISO-8859字符集来混淆客户端:

$ export NLS_LANG=ENGLISH_AMERICA.WE8ISO8859P1

然后在SQL * Plus中选择varchar2列:

select word from test;

结果是:

WORD
--------------------------------
�B�D�FGH�J

问号(实际上是“未知字符”)突出显示了我选择的字符与我告诉客户期望的字符之间的不匹配。

如果在操作系统提示符下,我设置$ NLS_LANG以匹配客户端设置,如下所示:

$ export NLS_LANG=ENGLISH_AMERICA.AL32UTF8 

并在SQL * Plus中对相同数据运行完全相同的查询:

select word from test;

结果是:

WORD
--------------------------------
ÁBÇDÉFGHÍJ

如果您的服务器正确存储重音字符,那么它必须使用支持这些字符集的字符集(上面的示例)。您的客户端还需要支持可以处理重音字符的字符集,并且您的NLS_LANG设置需要与客户端可以支持的设置相匹配。如何操作取决于您使用的客户端系统。

如果您有一个可以显示的客户端,并允许您输入重音字符,那么您可以解决原始问题。您不需要PL / SQL函数来进行转换,只需使用Oracle翻译功能,如下所示:

select word, translate(word, 'ÁÇÉÍ', 'ACEI') as no_accents from test;

WORD       NO_ACCENTS
---------- ----------
ÁBÇDÉFGHÍJ ABCDEFGHIJ
© www.soinside.com 2019 - 2024. All rights reserved.