如何使用Navicat导入Excel数据到数据库(Mysql为例)

一、 背景

有时候我们需要将Excel中的数据导入到数据库表里,从而更好地使用SQL进行复杂查询以满足我们的统计需求

二、环境

这里以MySQL为例,其他数据库也差不多,使用的环境是:

  • 测试的平台:windows
  • Navicat版本:Premium 12.1.12 (64-bit)
  • 数据库:mysql,5.7

PS:以上这些应该是不管是win还是mac,Navicat的版本应该跟我有差异,或者mysql版本跟我有差异,或者数据库类型不同,应该也是可以成功导入的。这里列出详细的版本仅仅是为了尽到告知。

三、如何用Navicat导入Excel到Mysql?

1、 提前建好表

提前按照Excel的数据,建好表。注意字符类型的字段的编码,保证是utf8或者utf8mb4。需要注意的是,表可能是utf8或者utf8mb4编码,但字段可能不是,要确保字段也是这个编码。

一般情况下字段的字符集会继承表默认的字符集,而表默认的字符集继承数据库默认的字符集。如果数据库默认的字符集一开始就是正确的,那后续就会正确。如果一开始库的字符集不正确,建的表的字符集就错误,导致字段的字符集错误,如果此时修改表的字符集是没有用的,因为字段还是错的字符集。

注意:如果是非utf8或者utf8mb4编码,例如latin1编码会导致导入内容含有中文时失败,如果是其他非utf8和utf8mb4编码可能能够导入但是出现中文乱码。

2、最好确保Excel有表头

比如最好第一行是表头,而不是直接就是数据(最佳实践)

3、开始导入
  • 选择要到入的表,点击下一步

  • 选择类型 Excel 文件,点下一步

  • 选择Excel文件的位置,点下一步

  • 勾选要导入数据的Sheet才能下一步(如果Excel文件有多个sheet会出现多个让你选择),点下一步

    下一步后见到如下这个图

  • 调整数据格式等,调整好后点下一步

    如果导入的字段有日期信息,按照要求调整,例如日期是按照年月日时分秒排列的,选择 YMD,日期分隔符根据实际选择/ 或者 -,所导入的Excel数据的第一行一般为表头

  • 选择要导入的表,之后下一步

    目标表就是说我们要导入到什么表,my_billing是我们提前就建好的,所以 “新建表” 复选框是不选中的状态并且也无法被选中

    (下图,展示了,如果将目标表改名,改一个库中不存在的名字,则 “新建表” 会自动勾选上了并且也无法取消勾选,应该是会在导入的时候自动创建表,但是不推荐自动创建表的方式,原因是字段类型可能无法控制)

  • 配置Excel中的字段和库表字段的映射关系,配置好后点击下一步

    点击 “目标字段” 会出现下拉框,提供了目标表的字段,可以配置Excel中的表字段要导入到目标表的哪个字段中

    (下图,出现了候选字段)

    (下图,配置好所有字段的映射关系后即可点击下一步)

  • 选择导入的模式,点击下一步

    导入的模式有追加数据和清除数据全新导入,按自己需求选择(**PS:**这里不知道为什么有些选项是灰色的,我遇到过没有置灰的情况)

    (下图,有些选项置灰,不知道为什么)

    (下图,某些时候又全部选项可以选择)

  • 点击开始

    (先出现一切ready的界面,等待你点击 “开始”)

    (下图,点击 “开始”,可以查看到报告,处理数,新增数,更新数,删除数,失败数(Errors))

可能遇到的问题

1、导入失败,或乱码

前面的 "提前建好表"已经提到了,是编码的问题。尤其要注意检查字段的编码,不光是 “我表的编码都对了为何还是导入失败”(因为可能你刚开始建的表是Latin1编码的,后来将表改成utf8或utf8mb4,但是改了之后字段还是Latin1)

(下图,就是因为编码问题导致的错误,Incorrent string value:'\xE4xB8\xAD\xE6\x96\x87')

补充

  • 自动映射字段

    如果Excel的表头的值,和数据库字段的值一样,能够自动设置好字段映射关系,如下图

  • 建表时的字段选择

    以mysql为例,浮点数最好用decimal类型,用float和double可能会丢失精度,或者varchar字串类型也行(就是处理数字的时候不太方便),比如decimal(30, 2)表示 允许2个小数点,整数部分可以是 30-2=28位

Navicat执行SQL文件时报错 `[SQL] Finished with error` 的原因是多方面的,可能涉及字符集问题、操作位置不当、运行选项设置错误以及SQL代码本身的语法或逻辑问题。以下是针对该问题的具体原因及解决方案: ### 1. **字符集不一致** 如果原始数据库和目标数据库之间的字符集或排序规则(collation)不同,则可能导致报错。如,某些版本的MySQL支持 `utf8mb4_0900_ai_ci` 排序规则,而旧版MySQL可能不认识这种规则[^4]。 #### 解决方案: - 确保源数据库和目标数据库使用的字符集完全相同。 - 如果无法更改目标数据库的字符集,可以在SQL脚本中手动调整字符集声明部分。如,将 `utf8mb4_0900_ai_ci` 替换为目标数据库支持的排序规则,如 `utf8_general_ci` 或者 `utf8mb4_general_ci`[^2]。 --- ### 2. **操作位置问题** 有时直接在连接处右键并选择“运行SQL文件”可能会引发异常行为。建议切换至更具体的上下文中执行SQL文件。 #### 解决方案: - 不要直接在连接节点上运行SQL文件,而是导航到特定的目标数据库下,进入“表”区域后再尝试运行SQL文件[^1]。 --- ### 3. **运行选项配置问题** Navicat提供了多个运行选项,默认情况下某些选项可能不适合当前环境,从而导致失败。 #### 解决方案: - 尝试取消勾选一些高级选项(如自动提交事务),然后再重新运行SQL文件。 --- ### 4. **SQL代码中的语法或逻辑问题** 最常见的问题是SQL代码本身存在错误。比如数据类型的定义不符合预期,或者字段属性与实际需求不符。如,`datetime` 类型不允许指定长度,但在SQL脚本中却指定了 `(N)` 形式的长度参数。 #### 解决方案: - 将整个SQL文件的内容复制到Navicat的查询编辑器中逐条执行,以便精确定位哪一部分引发了错误。 - 修改有问题的部分后保存更新后的SQL文件再重试。对于 `datetime(N)` 这类问题,可以直接删除括号及其内部内容。 ```sql -- 错误写法 CREATE TABLE example ( id INT PRIMARY KEY, created_at DATETIME(6) -- 此处会报错 ); -- 正确写法 CREATE TABLE example ( id INT PRIMARY KEY, created_at DATETIME -- 删除 (6),因为 datetime 不允许指定精度 ); ``` --- ### 5. **未提前创建目标数据库** 如果没有预先建立好接收数据的目标数据库,那么即使SQL脚本中有 `CREATE DATABASE` 命令也可能由于权限不足等原因跳过此步,最终造成后续指令找不到合法的工作空间而出错[^3]。 #### 解决方案: - 使用命令行工具或其他方式先行手工构建所需的空白数据库; - 或者确认SQL脚本开头确实包含了有效的 `CREATE DATABASE IF NOT EXISTS db_name; USE db_name;` 指令序列。 --- ### 总结 通过以上分析可以看出,解决Navicat运行SQL文件时遇到 `[SQL] Finished with error` 需综合考虑以下几个方面: - 数据库间的兼容性设定(尤其是编码体系差异) - 脚本加载路径选取合理性 - 用户界面交互偏好调节状况 - 导入文档质量控制标准 只要按照上述指导逐一排查即可有效降低此类故障发生的概率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值