暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 需要一些关于特殊字符的建议。

askTom 2018-03-06
263

问题描述

嗨,汤姆,

我正在使用Oracle数据库12c企业版版本12。1。0。2。0-64bit生产
需要一些关于如何处理特殊字符的建议。

My doubt with converting any special characters to normal character except below valid characters

下面提到的都是有效字符
a到z,A到Z,0到9
`~!@#%$^&*()_-+={}[]|\:;"'<>,。?/

在执行以下语句时
从对偶中选择转换 ('r ã á b ả g ã i è i ñ t ë rmn ç pl (DE)','us7ascii');

输出: R?AB?G?IE I?TERMNCPL (DE)
As per my requirement the output should be : RAABGAIE INTERMNCPL (DE) --(How can i achieve this one)。

1。 What could be the reason to convert it ? symbol。
2。 why it converts à to ? but Á to A。
3。 Does it converts unrecognized special characters to ? always or anything else。

Please help me to clear the doubts。

提前谢谢!!
Sunil。

专家解答

苏尼尔,

您正在尝试将CONVERT用于并非为其设计的目的。任何Oracle字符集 (Unicode AL32UTF8/UTF8/AL16UTF16除外) 都可以有替换字符的映射表。当字符集是字符集转换的目标时,此表告诉转换例程 (例如CONVERT) 如何处理字符集中不存在的传入源字符,因此无法直接转换。如果无法直接转换源字符,但它存在于映射表中,则将其来自表的相应 (映射) 替换字符放入目标字符串中。

除了某些字符的几种替代形式外,大多数字符集都没有真正使用此功能。您可以使用Oracle Locale Builder实用程序来检查支持的字符集的替换字符表。由于历史原因,US7ASCII字符集确实将纯拉丁字母定义为替代许多重音拉丁字母,主要是EE8ISO8859P2字符集中存在的那些字母。映射表没有覆盖所有可能的重音字符,甚至没有在WE8ISO8859P1中定义的所有字符。随着Unicode的流行,趋势是存储原始字符串,而不是试图将其压缩到旧字符集中。

如果你真的需要一个带有精简重音的字符串,你需要的基本上是一个NLS_BASE_LETTER函数,不幸的是我们没有。如果您必须替换的重音字符数是可管理的,则最好的选择是使用翻译功能进行字符替换。或者,您可以保留原始文本,但在SQL查询中使用具有比较和匹配表达式的 _ai排序规则 (语言排序) 之一。在Oracle数据库12.2中,您可以说:

从mytab1中选择 *,其中mycol1像 'A % '排序二进制 _ ai

而 “ã b” 和 “á b” 都将匹配。(在12.1中,您需要设置NLS_SORT和NLS_COMP会话参数,这可能很麻烦。)


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论