问题描述
你好,汤姆,
有没有办法只执行重音不敏感的转换?
我正在使用构造:
作为副产品,它还执行不区分大小写的替换,这不是必需的。
像这样的东西:
应输出:
而不是:
如果你想知道我为什么需要这个,那是因为我们将数据以UNICODE格式存储在我们的数据库中,但是我们需要使用基于拉丁语的字符将其导出到一个国际机构。
谢谢,
有没有办法只执行重音不敏感的转换?
我正在使用构造:
SELECT utl_raw.cast_to_varchar2(NLSSORT('ABCöüä', 'nls_sort=binary_ai')) FROM dual;
作为副产品,它还执行不区分大小写的替换,这不是必需的。
像这样的东西:
SELECT my_funct('ABCöüä') FROM dual;
应输出:
ABCoua
而不是:
abcoua
如果你想知道我为什么需要这个,那是因为我们将数据以UNICODE格式存储在我们的数据库中,但是我们需要使用基于拉丁语的字符将其导出到一个国际机构。
谢谢,
专家解答
不幸的是,目前没有内置功能可以执行转换为baseletter,这就是您所要求的。不支持使用NLSSORT的方法。此外,它在字符串的末尾添加了NUL字符 “\ 0”。你可能在屏幕上看不到它,但它就在那里。
如果您要导出为拉丁语,那么我假设您的意思是7位ASCII (基本拉丁字母A-Za-z),而不是所谓的Latin1字符集。Latin1 (又名WE8ISO8859P1) 支持西欧重音字母,因此通常不需要剥离重音。假设您知道数据库中存储的语言及其字母 (通常可以在Wikipedia中找到字母),则可以使用TRANSLATE功能将任何不受支持的字符映射到其首选的拉丁等效字符。
一种更通用的方法可能是使用DECODE将重音字母映射到基本拉丁语,然后组合重音符号 (Unicode码点在范围U 0300-U 036F中),而不是使用TRANSLATE来删除这些重音。但是,有一些拉丁字母,例如 “eth” (Ð) 或 “ae连字” (Æ),它们不会分解。此外,接近4000字节字符串的解码可能超过VARCHAR2的允许长度 (MAX_STRING_SIZE = EXTENDED,接近32767字节长度的字符串将执行此操作)。因此,最好使用简单的翻译调用将已知的重音字母映射到基本的拉丁等效字母。使用TRANSLATE,您可以映射多达4000个不同的字母,而不是必要的。
我们正在考虑将相关的映射功能添加到utl_i18n。音译函数,但这不会很快发生。
如果您要导出为拉丁语,那么我假设您的意思是7位ASCII (基本拉丁字母A-Za-z),而不是所谓的Latin1字符集。Latin1 (又名WE8ISO8859P1) 支持西欧重音字母,因此通常不需要剥离重音。假设您知道数据库中存储的语言及其字母 (通常可以在Wikipedia中找到字母),则可以使用TRANSLATE功能将任何不受支持的字符映射到其首选的拉丁等效字符。
一种更通用的方法可能是使用DECODE将重音字母映射到基本拉丁语,然后组合重音符号 (Unicode码点在范围U 0300-U 036F中),而不是使用TRANSLATE来删除这些重音。但是,有一些拉丁字母,例如 “eth” (Ð) 或 “ae连字” (Æ),它们不会分解。此外,接近4000字节字符串的解码可能超过VARCHAR2的允许长度 (MAX_STRING_SIZE = EXTENDED,接近32767字节长度的字符串将执行此操作)。因此,最好使用简单的翻译调用将已知的重音字母映射到基本的拉丁等效字母。使用TRANSLATE,您可以映射多达4000个不同的字母,而不是必要的。
我们正在考虑将相关的映射功能添加到utl_i18n。音译函数,但这不会很快发生。
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。