Python中如何解码sqlite3存储的转义字符串?
解决Python 3中sqlite3检索转义字符串的解码问题
嘿,这个问题我之前也碰到过,其实核心是搞清楚sqlite3在Python3里对字符串的处理逻辑,我给你分情况拆解:
先明确:正常情况下根本不需要额外解码!
Python3的sqlite3模块默认以Unicode文本类型处理字符串——你用正确的方式插入(参数化查询),数据库会自动处理转义,检索出来直接就是标准的str对象,直接打印就行。
比如正确的插入+检索流程:
import sqlite3 # 连接数据库 conn = sqlite3.connect('test.db') cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS notes (content TEXT)") # 用参数化查询插入带特殊字符的字符串(无需手动转义) cursor.execute("INSERT INTO notes VALUES (?)", ("I'm learning sqlite3, it's cool!",)) conn.commit() # 检索数据 cursor.execute("SELECT content FROM notes") result = cursor.fetchone()[0] print(result) # 直接输出:I'm learning sqlite3, it's cool!
这里重点是参数化查询(用?占位符传参),它不仅能避免SQL注入,还会让sqlite3自动帮你处理引号这类特殊字符的转义,完全不用你手动加\。
如果真的拿到了带转义符的字符串,怎么还原?
要是你之前用了错误的插入方式(比如手动加了转义符,或者从其他地方导入了带转义的字符串),检索后拿到类似"I\\'m learning sqlite3"这样的字符串,可以用两种方法还原:
方法1:用ast.literal_eval()
这个方法安全可靠,能正确解析转义字符:
import ast escaped_str = "I\\'m learning sqlite3" normal_str = ast.literal_eval(f'"{escaped_str}"') print(normal_str) # 输出:I'm learning sqlite3
方法2:用codecs.decode()配合unicode_escape编码
这个方法直接解码转义序列:
import codecs escaped_str = "I\\'m learning sqlite3" normal_str = codecs.decode(escaped_str, 'unicode_escape') print(normal_str) # 输出:I'm learning sqlite3
特殊情况:误存了字节类型
如果你不小心把bytes类型插入了数据库,检索出来的会是bytes对象,这时候需要用.decode('utf-8')转成字符串:
# 错误示例:插入bytes cursor.execute("INSERT INTO notes VALUES (?)", (b"I'm learning sqlite3",)) conn.commit() # 检索并解码 cursor.execute("SELECT content FROM notes") result_bytes = cursor.fetchone()[0] normal_str = result_bytes.decode('utf-8') print(normal_str) # 输出:I'm learning sqlite3
内容的提问来源于stack exchange,提问作者Damaru
相关产品推荐
相关产品推荐

