使用ENCLOSED BY时MySQL LOAD DATA语句出现编程错误求助
解决cursor.execute执行LOAD DATA时ENCLOSED BY子句报错的问题
问题根源
MySQL命令行能正常解析ENCLOSED BY "",但Python的数据库驱动(比如pymysql、mysql-connector)处理字符串时,会把连续双引号当成语法错误,或者转义逻辑出问题,导致ProgrammingError/OperationalError。
可行解决办法
1. 直接删掉ENCLOSED BY子句(最省事)
如果你的CSV里没有用任何字符包裹字段,完全可以去掉ENCLOSED BY ""这一行——MySQL默认就是不使用字段包围符,不会影响数据导入效果。修改后的SQL如下:
LOAD DATA LOCAL INFILE '/home/ubuntu/test.csv' INTO TABLE app_data CHARACTER SET UTF8MB4 FIELDS TERMINATED BY ',' IGNORE 1 ROWS LINES TERMINATED BY '\r\n'
2. 换用单引号定义空包围符
如果一定要明确指定“无包围符”,把双引号换成单引号,同时注意Python字符串的写法:
- 用三单引号包裹SQL,内部直接写
ENCLOSED BY '':
sql = ''' LOAD DATA LOCAL INFILE '/home/ubuntu/test.csv' INTO TABLE app_data CHARACTER SET UTF8MB4 FIELDS TERMINATED BY ',' IGNORE 1 ROWS ENCLOSED BY '' LINES TERMINATED BY '\r\n' ''' cursor.execute(sql)
- 用三双引号包裹也可以,内部单引号不用转义:
sql = """ LOAD DATA LOCAL INFILE '/home/ubuntu/test.csv' INTO TABLE app_data CHARACTER SET UTF8MB4 FIELDS TERMINATED BY ',' IGNORE 1 ROWS ENCLOSED BY '' LINES TERMINATED BY '\r\n' """ cursor.execute(sql)
3. 检查连接是否开启LOCAL INFILE权限
要是上面的方法还报错,得确认数据库连接时有没有开启本地文件导入权限:
- 用pymysql的话,连接参数加
local_infile=True:
import pymysql conn = pymysql.connect( host='localhost', user='你的用户名', password='你的密码', db='目标数据库', local_infile=True ) cursor = conn.cursor()
- 用mysql-connector的话,加
allow_local_infile=True:
import mysql.connector conn = mysql.connector.connect( host='localhost', user='你的用户名', password='你的密码', database='目标数据库', allow_local_infile=True ) cursor = conn.cursor()
内容的提问来源于stack exchange,提问作者sureshvv
相关产品推荐
相关产品推荐

