我想将表格列的所有德语字符替换为相应的英文字符。当我尝试使用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
答案 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 charmap
或echo $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中没有。