在BLOB中为单字节Oracle部署存储多字节数据

时间:2018-11-22 03:35:40

标签: oracle

根据客户的要求,我们将oracle(版本-12c)部署配置为支持单字节或多字节数据(通过字符集设置)。出于性能原因,需要缓存第三方多字节数据(json)。我们发现可以将数据编码为UTF-8并将其保存(在将其转换为字节之后)在Oracle表的BLOB列中。这是一种黑客,它使我们可以在单字节部署中存储多字节数据。这种方法存在某些局限性,例如

  1. 无法通过SQL代码(存储过程)查询或更新数据。
  2. 使用的搜索操作,例如无法执行LIKE运算符。
  3. 在应用程序层(java)的每个操作的编组和解组开销

假设我们要克服这些限制,还有其他缺点我们应该注意吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

好的,我正在总结我的评论,并给出正确的答案。

您有两种可能的解决方案:

  1. 将它们存储在NVARCHAR2 / NCLOB列中
  2. 重新编码JSON值,以便仅使用ASCII字符

1。 NCLOB / NVARCHAR

“ NVARCHAR2”中的“ N”字符代表“国家”:这种类型的列已被完全引入,用于存储“数据库字符集”中无法表示的字符。

Oracle实际上支持两个字符集:

  1. “数据库字符集”,它用于常规varchar / char / clob字段和内部数据字典(换句话说:它是可用于命名表,触发器,列等...)

  2. “国家字符集”:用于存储NCLOB / NCHAR / NVARCHAR值的字符集,应该用来存储本国语言中使用的“怪异”字符。

    < / li>

通常第二个是UNICODE字符集,因此即使在较旧的安装中,您也可以在其中存储任何类型的数据

2。仅使用ASCII字符编码JSON值

诚然,JSON标准在设计时就考虑了UNICODE,但也确实允许使用字符代码点的极高表示形式将字符表示为转义序列。如果代码点大于127,则可以仅使用ASCII字符来表示任何unicode对象。

此ASCII JSON字符串:'{“ UnicodeCharsTest”:“ ni \ u00f1o”}'表示另一个对象:'{“ UnicodeCharsTest”:“niño”}'。

我个人更喜欢第二种方法,因为它允许我也轻松地与使用过时旧版协议的系统共享这些json字符串,并且它还允许我确保所有客户端都能正确读取json字符串,而不管其国家/地区设置如何( oracle客户端协议可以尝试将字符串转换为客户端使用的字符...这是我不想处理的复杂问题,顺便说一句:这可能是您遇到SQL问题的原因客户)