从MS SQL Server 2014导入导出向导导出至MySQL时遇语法错误
解决SQL Server导出到MySQL时的ODBC语法错误问题
我来帮你拆解这个问题,从错误信息就能定位到核心原因——MySQL 5.6和ODBC 8.0驱动的标识符语法兼容冲突,下面是具体分析和解决方案:
错误根源分析
你看到的错误语句"shipyards" ("shipyard_id", "shipyard") VALUES (?, ?),问题出在双引号"上:
- MySQL 5.6默认的
sql_mode不允许用双引号包裹表名/列名,它只识别反引号`作为标识符引号 - 而你用的ODBC 8.0驱动默认遵循ANSI SQL标准,会用双引号来标识表和列,这就导致MySQL报错语法错误
分步解决方案
1. 修改MySQL的sql_mode启用ANSI_QUOTES
这是最直接的解决方法,让MySQL支持双引号标识符:
- 临时生效:登录MySQL客户端,执行以下命令,然后重新打开ODBC连接:
SET GLOBAL sql_mode = 'ANSI_QUOTES'; - 永久生效:找到MySQL的配置文件(Windows是
my.ini,一般在MySQL安装目录下;Linux是my.cnf),在[mysqld]节点下添加:
保存后重启MySQL服务即可。sql_mode = ANSI_QUOTES
2. 调整ODBC数据源的配置
也可以在驱动层面关闭双引号标识符的使用:
- 打开Windows的「ODBC数据源管理器(64位)」,找到你配置的MySQL数据源,点击「编辑」
- 切换到「高级」或「详细信息」标签,找到
SQL_QUOTES_ANSI选项,取消勾选;或者直接在连接字符串末尾加上ANSI_QUOTES=0 - 保存配置后重新运行导出向导
3. 检查并修正表列映射
虽然错误主要是引号问题,但还是确认下映射避免其他坑:
- 在导出向导的「列映射」步骤,确认目标表
shipyards的shipyard_id(int)和shipyard(varchar(55))分别对应源库的同类型列 - 可以尝试在向导里选择「编辑SQL」,手动把双引号替换成反引号,比如改成:
`shipyards` (`shipyard_id`, `shipyard`) VALUES (?, ?)
4. 降级ODBC驱动版本(备选)
ODBC 8.0和MySQL 5.6的版本跨度较大,可能存在其他兼容性问题:
- 卸载当前的mysql-connector-odbc-8.0.21,安装适配MySQL 5.6的5.3.x版本驱动(比如mysql-connector-odbc-5.3.13-winx64)
- 重新配置ODBC数据源后再执行导出操作
内容的提问来源于stack exchange,提问作者Jason Holmes
相关产品推荐
相关产品推荐

