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

Oracle 转换函数不使用给出垃圾值的CLOB数据类型

askTom 2018-09-04
644

问题描述

我们有一些类型为lob和varchar2的数据,我们需要将其导出到另一个支持CSV的应用程序,即它仅以CSV的形式读取数据。它的遗留应用程序,因此我们需要以CSV格式从oracle数据库导出数据,并需要将其发送到该应用程序。
问题是,应用程序仅支持ASCII 7位字符 (ASCII代码最多127仅无符号) 对于扩展支持,我们将ASCII代码> 128转换为127下的ASCII代码,以最大程度地减少数据丢失,因为我们有一个映射表,该映射表将字符从we8mswin1252 (8位编码) 映射到ASCII 7位人物。
目前,我们有一个用Ruby编写的程序,但是它的速度非常慢,因此我们想在Oracle中重写它。

因此,我们需要将varchar以及CLOB类型的数据转换为we8mswin1252编码 (或任何其他8位编码),然后使用映射表并将数据转换为ASCII 7位编码。
我得到了用于字符集转换的转换函数,该函数与varchar2数据类型一起工作正常,但是与CLOB一起使用时会给出一些模糊字符。我当前的编码是数据库的AL32UTF8。

选择值,转换 (值,'we8mswin1252 '),转换 (to_clob (值),'we8mswin1252') 从temp;

董事会选举-股东提名䉯慲搠䕬散瑩潮猠阠卨慲敨潬摥爠乯浩湡瑩潮


从nls_database_parameters中选择 *,其中参数像 “% CHARACTERSET %”;

我写了一个自定义函数,我打破CLOB到chunks和转换为varchar2这样做,但它需要太多,因此想知道为什么convert表现得像这样,如果有任何其他构建的函数,我可以尝试将非常有帮助。

谢谢

专家解答

CONVERT函数是一个遗留函数,不应用于任何与应用程序相关的字符集转换。您不能以支持的方式在AL32UTF8数据库中有WE8MSWIN1252 VARCHAR2或CLOB字符串。因此,默认情况下不支持CONVERT(...,'we8mswin1252 '[,'al32utf8']) 的结果。CLOB特别棘手,因为它在多字节数据库 (例如AL32UTF8) 中使用特殊的存储编码。转换仅对某些修复任务有用。

在数据库字符集以外的字符集中处理数据的支持方法是使用原始数据类型和来自包UTL_I18N的转换过程。但是,UTL_I18N不支持CLOBs。因此,您必须读取32k块中的clob,使用UTL_I18N.STRING_TO_RAW将它们转换为WE8MSWIN1252,进行后处理并使用UTL_FILE.PUT_RAW写入文件。

另外,您实际上可以在AL32UTF8数据上使用TRANSLATE进行翻译 (也由于TRANSLATE不接受clob而被分块)。由于生成的文本是US7ASCII,因此您可以直接使用UTL_FILE.PUT_LINE编写它,因为US7ASCII是AL32UTF8的适当二进制子集,因此无需转换。免责声明: 翻译对于多字节字符集中的大型替换集 (128个字符) 来说相当慢,但也许就足够了。

另一种选择: 在C中重写代码。用OCI将CLOB数据读取到AL16UTF16缓冲区中 (AL16UTF16是AL32UTF8数据库中的实际CLOB编码,因此不需要转换),并在C中进行后处理 (重音剥离)。我真的没有看到在整个过程中需要中间转换为WE8MSWIN1252。当数据在AL16UTF16缓冲区中时,逐个字符 (以大端序方式将其读入 'int ch' 变量),然后进行字符转换。首先,检查 “ch” 是否小于256,这使其成为WE8ISO8859P1代码,WE8MSWIN1252的子集 (WE8ISO8859P1代码在数字上等于前256个AL16UTF16代码)。您可以使用您的映射表为WE8ISO8859P1代码生成US7ASCII输出字节。如果 'ch' 的值大于或等于256,则可以对WE8MSWIN1252-specific字母 ('š ','œ','ž ','ð') 或标点符号 (''','''™'),如果认为有必要的话。对于任何未映射的字符,请跳过它或替换为空格或问号或您选择的任何其他默认替换字符 (Oracle使用 “?”)。

或者,在Java JDBC中尝试相同的方法。


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

评论