【问题标题】:Converting German special characters to English equivalent one in Oracle SQL / PL-SQL在 Oracle SQL / PL-SQL 中将德语特殊字符转换为英语等效字符
【发布时间】:2015-11-18 11:45:29
【问题描述】:

我想将表格一列的所有德语字符替换为相应的英文字符。当我尝试使用 Replace() 函数时,它没有返回富有成效的结果。 我想将所有德语特殊字符(如 - Ä Ö Ü ö ä ü ß 替换为 Ae Oe Ue oe ae ue ss)。请让我知道如何执行?我需要更改任何数据库设置吗?

请在下面找到一些结果:

select replace('a b c d e ä f g ö','ä','ae') from dual;
Output:


REPLACE('ABCDEDFGV','D','AE')
a b c ae e ae f g v

我使用 Toad 作为数据库工具。下面是几个数据库参数:

PARAMETER VALUE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET WE8ISO8859P1
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE GERMAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_RDBMS_VERSION 9.2.0.5.0
NLS_SAVED_NCHAR_CS WE8ISO8859P1

【问题讨论】:

  • 您的“输出”似乎来自不同的查询。这将有助于显示相应的查询和结果。

标签: oracle plsql


【解决方案1】:

您的终端字符集与您的 NLS_LANG 字符集不匹配。他们必须匹配。你可以这样做:

C:\>chcp
Active code page: 850

C:\>set NLS_LANG=.WE8PC850

C:\>sqlplus user/pwd@DB

SQL> select replace('a b c d e ä f g ö','ä','ae') from dual;

当您在 Linux/Unix 上工作时,chcp 等效于 locale charmapecho $LANG。您还可以更改当前代码页,例如chcp 65001 用于 UTF-8。

一些常见的配对是:

  • 代码页 850:(windows 默认)chcp 850 -> WE8PC850

  • 代码页 1252:chcp 1252 -> WE8MSWIN1252

  • ISO-8859-1:chcp 28591 -> WE8ISO8859P1

  • ISO-8859-15:chcp 28605 -> WE8ISO8859P15

  • UTF-8:chcp 65001 -> AL32UTF8

无论您使用哪种方式,都可以根据您的终端字符集更改 NLS_LANG,反之亦然。通过NLS_LANG=.WE8PC850,您不会覆盖您当前的语言和地区。当然你也可以NLS_LANG=GERMAN_GERMANY.WE8PC850

在您的情况下,chcp 28591 -> WE8ISO8859P1 可能是“最好的”,因为这样您就可以使用数据库支持的任何字符。如果您使用其他设置,例如“Codepage 1252”你可能会得到一些不受支持的字符,例如¿ 代表 ,因为 WE8ISO8859P1 不支持欧元货币符号。

【讨论】:

    【解决方案2】:

    结果有什么问题?它将ä 替换为ae。现在对所有其他字符重复.... 由于替换只会用另一个替换 1 个序列,因此您将得到很多嵌套替换。

    select replace(replace('a b c d e ä f g ö','ä','ae'),'ö','oe') from dual
    

    等等

    【讨论】:

    • 结果似乎是a b c ae e ae f g v,但它应该是a b c d e ae f g öd 也被 ae 替换。
    • 如果你能仔细检查答案,你会发现它用 'ae' 替换了 'ä' 以及字符 'd'
    • 我得到:a b c d e ae f g oe: 作为查询的输出。
    【解决方案3】:

    来自OTN, "replace characters with accent with their base letter"

    with demo as (
        select 'a b c d e ä f g ö' as de from dual
    )
    select de
         , utl_raw.cast_to_varchar2(nlssort(de, 'nls_sort=binary_ai')) as en
    from   demo;
    

    说明: nlssort() 返回用于排序的字符的二进制表示,这是您想要的基本字符。 utl_raw.cast_to_varchar2 将二进制版本转换为字符串。

    编辑:嗯,正如 Alex 所指出的,这并不是 OP 所要求的。对不起。

    结果还取决于数据库、桌面和应用程序的全球化设置,当我从 Web 浏览器复制示例文本、将该文本粘贴到应用程序以及应用程序显示结果时,可能会出现差异.我在 PL/SQL Developer 11 中使用 NLS_CHARACTERSET = AL32UTF8 等获得了预期的基本字符,但在同一个英国 Windows 桌面上的 SQL*Plus 11.2 中却没有。

    【讨论】:

    • ß 转换为ss;但是 äa 而不是 OP 想要的 ae
    • 很好看。看起来等效的基本字符可能不是我们想要的。
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2011-01-22
    • 2019-09-27
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多