在Oracle SQL / PL-SQL中将德语特殊字符转换为英语等效字符

时间:2015-11-18 11:45:30

标签: oracle plsql

我想将表格列的所有德语字符替换为相应的英文字符。当我尝试使用Replace()函数时,它不会返回有效的结果。 我想将所有德国特色字符替换为Ae Oe ue ae ee 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

3 个答案:

答案 0 :(得分:3)

您的终端字符集与您的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。您还可以更改当前的代码页,例如UTF-8 chcp 65001

一些常见的配对是:

  • 代码页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可能是" best",因为这样您就可以使用数据库支持的任何字符。如果您使用其他设置,例如"代码页1252"您可能会收到一些不受支持的字符,例如¿ ,因为WE8ISO8859P1不支持欧元货币符号。

答案 1 :(得分:1)

结果出了什么问题?它取代了ä与ae。现在重复所有其他字符....由于replace只会将1个序列替换为另一个序列,因此您将获得大量嵌套替换。

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

答案 2 :(得分:0)

来自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将二进制版本转换为字符串。

编辑:嗯,正如亚历克斯指出的那样,这不是OP所要求的。遗憾。

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