嵌套JSON转MySQL表遇1064语法错误,求问题排查方案
JSON导入MySQL失败的原因分析与解决建议
错误原因分析
- 字段名含特殊字符:JSON键名里的单引号(如
BEEN KO'D PERCENTAGE中的')、空格、点号(如EST. POWER中的.)属于MySQL标识符的特殊字符,直接使用会被SQL解析器当成语法符号,引发语法错误。 - 导入工具自动映射缺陷:Table Data Import Wizard处理带特殊字符的JSON键时,未自动给字段名添加反引号
`转义,导致生成的SQL语句语法违规。
解决建议
方法1:修改JSON键名(推荐)
手动替换原始JSON中的特殊字符,使其符合MySQL字段命名规范:
- 空格替换为下划线
_ - 单引号移除或替换
- 点号替换为下划线
修改后的JSON示例:
{ "name": "JORGE SEBASTIAN ANGULO", "WINS": "0", "LOSSES": "0", "DRAWS": "0", "KO_PERCENT": "0%", "ROUND_KO_PERCENTAGE": "0%", "ROUNDS_BOXED": "0", "BEEN_STOPPED": "0", "OPPONENTS_STOPPED": "0", "BEEN_KOD_PERCENTAGE": "0%", "BEEN_KOD_ROUND_PERCENTAGE": "0%", "AVERAGE_WINNING_ROUND": "0", "AVERAGE_LOSING_ROUND": "0", "KNOCKOUT_PERCENT": "0%", "EST_POWER": "0%", "EST_CHIN_BODY": "0%", "win_type": {}, "opponent": { "TOTAL_FIGHT_COUNT": "0", "EST_POWER_AVERAGE": "0%", "EST_PUNCH_RESISTANCE": "0%" } }
修改后再用导入工具即可正常识别字段。
方法2:手动建表后导入
- 先创建包含特殊字段名的表,用反引号包裹特殊字段:
CREATE TABLE boxers ( `name` TEXT, `WINS` TEXT, `LOSSES` TEXT, `DRAWS` TEXT, `KO %` TEXT, `ROUND KO PERCENTAGE` TEXT, `ROUNDS BOXED` TEXT, `BEEN STOPPED` TEXT, `OPPONENTS STOPPED` TEXT, `BEEN KO'D PERCENTAGE` TEXT, `BEEN KO'D ROUND PERCENTAGE` TEXT, `AVERAGE WINNING ROUND` TEXT, `AVERAGE LOSING ROUND` TEXT, `KNOCKOUT %` TEXT, `EST. POWER` TEXT, `EST. CHIN/BODY` TEXT, `win_type` JSON, `opponent` JSON );
- 使用Table Data Import Wizard时选择「已存在的表」,将JSON键映射到对应字段即可。
方法3:使用LOAD DATA INFILE命令(进阶)
适合大数量导入,手动处理字段映射与转义:
LOAD DATA INFILE '/本地文件路径/你的数据.json' INTO TABLE boxers FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (@json) SET `name` = JSON_UNQUOTE(JSON_EXTRACT(@json, '$.name')), `WINS` = JSON_UNQUOTE(JSON_EXTRACT(@json, '$.WINS')), `BEEN KO'D PERCENTAGE` = JSON_UNQUOTE(JSON_EXTRACT(@json, '$."BEEN KO\'D PERCENTAGE"')), `win_type` = JSON_EXTRACT(@json, '$.win_type'), `opponent` = JSON_EXTRACT(@json, '$.opponent');
注意:需确保MySQL允许本地文件导入,且文件路径正确。
内容的提问来源于stack exchange,提问作者DOMINi04
相关产品推荐
相关产品推荐

