MySQL加载含JSON列的CSV文件报ERROR 3140的问题求助
我来帮你拆解这个问题的根源,其实核心差异在于LOAD DATA和INSERT语句对转义字符的处理逻辑完全不同:
为什么INSERT能正常工作?
当你用INSERT执行插入时,SQL语句里的"{\"Key1\": 100,\"key2\": \"Abc\"}"中,\"是给SQL解析器看的转义符——MySQL会把它转换成实际的双引号",最终写入JSON字段的内容是标准合法的{"Key1": 100,"key2": "Abc"},自然能通过JSON格式校验。
为什么LOAD DATA会触发JSON错误?
你的LOAD DATA语句用了optionally enclosed by '"',这个参数会让MySQL自动处理双引号包裹内容里的转义字符:CSV文件里的\"会被直接转换成",而不是保留转义结构。这样一来,jfield1字段实际被解析成了:
{Key1: 100,key2: "Abc"}
这显然不符合JSON规范——JSON要求所有键名必须用双引号包裹,所以MySQL直接抛出了Invalid JSON text的错误。
两种可行的解决方案
方案1:修改CSV文件,移除JSON字符串的转义
把CSV里的"{\"Key1\": 100,\"key2\": \"Abc\"}"改成{"Key1": 100,"key2": "Abc"}(去掉所有转义的反斜杠),修改后的CSV内容如下:
id,name,jfield1,jfield2 1,"A","{"Key1": 100,"key2": "Abc"}","{}" 2,"B","{"Key1": 101,"key2": "Def"}","{}"
之后再执行原来的LOAD DATA语句就能正常导入了,因为此时MySQL解析双引号内的内容时,会直接得到合法的JSON格式。
方案2:修改LOAD DATA语句,指定转义字符规则
如果不想修改CSV文件,可以在LOAD DATA语句中添加escape by '\\'(注意这里需要双重转义,因为SQL里的反斜杠本身需要转义),让MySQL保留CSV里的转义逻辑。修改后的语句如下:
load data local infile "/home/user/sample.csv" into table test fields terminated by ',' optionally enclosed by '"' escape by '\\' lines terminated by '\n';
这个参数会告诉MySQL:CSV中的反斜杠是转义字符,需要保留它的转义作用。这样jfield1字段的内容会被正确解析为{"Key1": 100,"key2": "Abc"},顺利通过JSON格式校验。
你可以根据自己的实际场景选择其中一种方案,两种方式都能解决这个报错问题。
内容的提问来源于stack exchange,提问作者learner

