sql server 利用navicat导出的csv,再导入另外一台机器上的mysql的时候出现编码错误

1.问题描述

sql server位于A机器,windows10操作系统

mysql位于B机器,windows10操作系统

B机器上使用mysql workbench,导入的时候每次仅仅导入2574条数据之后便中断了,csv中有2686365条数据

csv文件无论是使用记事本还是sublime都能正常打开,中英文正常显示,没有乱码

但是就是导入mysql会中断

使用python的时候没法使用utf8打开,只能使用gbk编码打开,而且读取到2576行的时候,显示

UnicodeDecodeError: 'gbk' codec can't decode byte 0xaa in position 5450: illegal multibyte sequence

曾将csv转为xlsx文件,再转为csv,仍旧是读取到2576行的时候报解码错误。

2.UTF-8-BOM编码

使用notepad++打开以后发现编码方式不是gbk也不是utf-8,而是UTF-8-BOM

在notepad++中点击“编码”,转换为UTF-8编码以后,再导入mysql报错:

UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 4: illegal multibyte sequence

一条数据都导入不了了。

至于为什么python使用gbk读取utf-8-bom编码文件,我猜想应该是gbk和utf-8-bom编码有交集

3.解决办法

最后:使用Python读取notepad++将utf-8-bom编码转换为utf-8编码后的文件,转换为sql脚本

4.新的解决办法

过几天又发现了一个解决办法:使用python将utf8编码的csv文件转换为gbk编码的文件:

def csv_encoding_transform(src,dst):
  with open(src, 'r', encoding='utf8') as csvfile:
      content = csvfile.read()
      with open(dst, 'w', encoding='gbk') as csvfile2:
        csvfile2.write(content)

这个代码是生效的,之前写了一个转编码方式的代码不生效:

def csv_encoding_transform(src,dst):
    with open(src, 'r', encoding='utf8') as csvfile:
      content = csvfile.read()
      with open(dst, 'wb') as csvfile2:
        csvfile2.write(content.encode("gbk"))

5.新发现

通过点击Help/Show Log File发现日志文件内容:

15:00:29 [ERR][       pymforms]: Unhandled exception in Python code: 
Traceback (most recent call last):
  File "C:\Program Files\MySQL\MySQL Workbench 8.0 CE\workbench\wizard_page_widget.py", line 97, in go_next
    self.main.go_next_page()
  File "C:\Program Files\MySQL\MySQL Workbench 8.0 CE\workbench\wizard_form.py", line 76, in go_next_page
    self.pages[index].page_activated(True)
  File "C:\Program Files\MySQL\MySQL Workbench 8.0 CE\modules\sqlide_power_import_wizard.py", line 185, in page_activated
    self.call_create_preview_table()
  File "C:\Program Files\MySQL\MySQL Workbench 8.0 CE\modules\sqlide_power_import_wizard.py", line 343, in call_create_preview_table
    self.create_preview_table(self.call_analyze())
                              ^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\MySQL\MySQL Workbench 8.0 CE\modules\sqlide_power_import_wizard.py", line 352, in call_analyze
    if not self.active_module.analyze_file():
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\MySQL\MySQL Workbench 8.0 CE\modules\sqlide_power_import_export_be.py", line 505, in analyze_file
    line = csvfile.readline()
           ^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa1 in position 5: illegal multibyte sequence

原来MySQL Workbench的Data Import Wizard 是通过python脚本导入文件的

open函数并没有指定encoding参数,使用的是默认编码

查看Python官方文档得知,encoding默认编码与平台相关

MySQL Workbench有自己的python.exe

但是直接运行这个python.exe是不行的

MySQL 文档中提供了一个运行python代码的方法:Scripting Shell,快捷键 ctrl+f3

需要新建一个python script

可以看到locale.getencoding()输出的是cp936,Python的版本号是3.11.4

而cp936就是GBK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值