使用LOAD_FILE向MySQL插入数据时sample字段为NULL的问题排查
我来帮你一步步排查为啥文件内容没成功插入到sample字段里——虽然没报错,但结果却是NULL,这确实有点坑:
1. 先确认文件是否真的被正确读取了
很多问题根源都在读取环节,你可以先在代码里加个调试打印,看看读取到的内容到底是什么:
with open('C:/Discharge_Summary/sample_648.txt', 'r', encoding='utf-8') as f: content = f.read() print("读取到的内容:", repr(content)) # 用repr能显示换行、空格这类不可见字符
- 如果打印出来是空字符串,要么是文件路径写错了(虽然
C:/格式在Python里是合法的,但可以检查下文件是否真的在这个路径下),要么是文件编码不匹配——比如文件是GBK编码,你用UTF-8读取就可能读成空,试试把encoding改成gbk或者utf-8-sig。 - 如果有乱码,那肯定是编码问题,得先统一文件和读取的编码。
2. 检查SQL插入的参数传递是否正确
MySQLdb的参数占位符是%s,很多人会在这里踩坑,比如没正确把读取到的内容传进去:
错误写法示例:
# 直接拼字符串或者占位符用错 cursor.execute("INSERT INTO mytable (sample) VALUES (content)") # 或者参数没写成元组 cursor.execute("INSERT INTO mytable (sample) VALUES (%s)", content)
正确写法:
# 第二个参数必须是元组,哪怕只有一个参数也要加逗号 cursor.execute("INSERT INTO mytable (sample) VALUES (%s)", (content,))
3. 注意sample字段的长度限制
你的sample是nvarchar(45),最多只能存45个Unicode字符。如果你的txt文件内容长度超过这个限制,虽然MySQL默认会截断,但极端情况下(比如开启了严格SQL模式)可能会直接存成NULL。你可以先打印下内容长度确认:
print("内容字符长度:", len(content))
如果确实超长,要么把字段类型改成TEXT/LONGTEXT,要么截取内容:content = content[:45]
4. 数据库编码与文件编码不匹配
如果数据库或表的字符集是latin1这类不支持中文/特殊字符的编码,而你的文件是UTF-8编码,就可能导致插入后内容变成NULL。可以用SQL语句查下编码:
SHOW CREATE DATABASE myblog; SHOW CREATE TABLE mytable;
如果字符集不是utf8mb4(推荐支持全Unicode的编码),建议修改,同时连接数据库时指定编码:
db = MySQLdb.connect(host='localhost', user='你的用户名', passwd='你的密码', db='myblog', charset='utf8mb4')
5. 别忘了提交事务
MySQLdb默认是关闭自动提交的,如果你插入后没调用commit(),虽然代码没报错,但数据其实没持久化到磁盘里。不过你说查询到了NULL的记录,这个可能性相对小,但还是可以确认下:
cursor.execute(...) # 插入语句 db.commit() # 一定要加这句!
先从「文件读取」和「参数传递」这两个最常见的原因查起,大概率能解决问题~
内容的提问来源于stack exchange,提问作者nina_dev
相关产品推荐
相关产品推荐

