在Python中按字节长度分割字符串

时间:2018-11-19 17:37:12

标签: python oracle

我遇到一种情况,我需要在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]

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我最终将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问题,但这可能会使我的字符串长度增加一倍以上。