【问题标题】:Split string by byte length in Python在 Python 中按字节长度拆分字符串
【发布时间】:2018-11-19 17:37:11
【问题描述】:

我需要在 Oracle VARCHAR 中插入超过 4000 个字符,并且有人建议我不要使用 CLOB。建议的解决方案是将其分成 2 列,每列 4000 列,8000 列应该足够了。我使代码动态化,因此可以处理 X 列以供重用。它运行良好,通过了测试等,直到它被部署并且有人从 Microsoft 产品中复制和粘贴它并且由于函数中生成了超过 4000 字节而损坏。我没有考虑过 unicode。

我尝试了几种想法来解决这个问题,然后才决定从 4000 个字符开始,如果字节长度超过 4000,删除一个字符并再次检查字节长度。它有效,但我想知道是否有更好的解决方案。该函数还将列名从“column”更改为“column1”、“column2”等。

 text = data[key]
 index = 1
 while text:
     length = 4000
     while len(text[0:length].encode('utf-8')) > 4000:
          length -= 1
     data['{}{}'.format(key, index)] = text[0:length]
     text = text[length:]
     index += 1
 del data[key]

【问题讨论】:

  • This question/answer 有一个与您类似的解决方案,但它可能还有一些您会觉得有用的其他功能

标签: python oracle


【解决方案1】:

检查您针对 CLOB 的建议是否是最新的,或者它是否基于有关使用定位器访问 LOB 的旧信息。

cx_Oracle 中“小型”CLOB 的最佳实践是将它们表示为字符串:您的代码将简单且高效。见例子https://github.com/oracle/python-cx_Oracle/blob/master/samples/ReturnLobsAsStrings.py

另一个解决方案是使用支持 32K VARCHAR2 的最新版本的 Oracle DB。

【讨论】:

  • 他有很多原因,从它的存储方式、备份方式到他多年来遇到的 LOB 问题列表。也许现在情况不同了,idk,但他并没有让步。我喜欢 32K 的想法,但数据库是为 4k 设置的。
【解决方案2】:

我最终将G. Andersons link 与我的代码结合在一起。它的效率更高,因为它不会对每个长度检查进行编码。

    encoded_text = data[key].encode('utf-8')
    index = 1
    while encoded_text:
        length = min(4000, len(encoded_text))
        if len(encoded_text) > 4000:
            while (encoded_text[length] & 0xc0) == 0x80:
                length -= 1
        data['{}{}'.format(key, index)] = encoded_text[:length].decode('utf-8')
        encoded_text = encoded_text[length:]
        index += 1
    del data[key]

我还玩弄了使用 encode('unicode-escape') 来解决 unicode 问题的想法,但这可能会使我的字符串长度增加一倍以上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多