尝试使用脚本,但特殊字符变为问号。
感谢@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