【问题标题】:How to insert Blob column in Oracle with Non-Ascii characters in Oracle?如何在 Oracle 中使用非 Ascii 字符在 Oracle 中插入 Blob 列?
【发布时间】:2020-01-10 23:00:30
【问题描述】:

我正在尝试将数据插入/更新到几乎没有非 Ascii 字符的 BLOB 列中。当我检索列值时,它们的获取方式与插入它们时不同。

// 这是非常大的数据文本的示例数据或数据 sn-p,我看到更新后的差异。

试过这个更新的查询:

更新 Blob_table SET FILE_BLOB = utl_raw.cast_to_raw('00001Ý#01¨ return') 其中 eid = 1;

当我取表时:

SELECT FILE_BLOb FROM Blob_table WHERE eid = 1;

以上查询输出:00001×#01×返回

预期: 00001Ý#01¨ 返回

实际: 00001Ã#01¨ 返回

谁能解释为什么数据被错误检索以及如何修复它们?

Oracle 数据库版本:

"Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - 生产 版本 18.5.0.0.0"

字符集详情:

NLS_NCHAR_CHARACTERSET - AL16UTF16

NLS_CHARACTERSET - AL32UTF8

【问题讨论】:

  • 这一般是字符集的问题。您使用哪种工具来获取数据?
  • SQL Developer 4.2.0.16.356
  • 你为什么用BLOB而不是CLOB?字符集 AL32UTF8 支持任何字符,所以转换为 BLOB 对我来说似乎毫无意义。
  • 是的,我同意。但是这个表已经是现有的表,用户想要这样。我们看到一些特殊字符进入该表。所以想知道为什么这些原始字符会被改变,有什么方法可以用 BLOB 列本身来修复它们。否则(没有其他选择)我们必须向用户推荐有 CLOB 列。
  • 如果是BLOB,用户在SQL Developer中上传文件:it.toolbox.com/blogs/loannismoutsatsos/…

标签: oracle blob


【解决方案1】:

BLOB 保存二进制数据,因此预期的输出应该类似于3030303031C39D233031C2A82072657475726E

如果您期望00001Ý#01¨ return,那么您需要将二进制数据转换回字符数据,显然您的工具会隐式执行此操作。使用CAST_TO_VARCHAR2 应该会返回正确的结果。

CAST_TO_VARCHAR2 使用当前数据库字符集(在您的情况下为 AL32UTF8)。如果您的客户端使用不同的字符集,那么您必须使用DBMS_LOB.CONVERTTOCLOB,您可以在那里指定它。

但是,最简单的方法是将您的列转换为正确的数据类型CLOB,这将使您的生活更轻松。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-26
    • 2018-11-13
    • 2011-06-21
    • 2015-12-04
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多