我遇到一种情况,我需要在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]
答案 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问题,但这可能会使我的字符串长度增加一倍以上。