前言
Mysql导入正常编码文件的方法就不赘述了,今天主要说一说Mysql导入中文csv的解决办法,折腾了一下午终于解决了。
需要使用到的工具有:Notepad++,Mysql8.0
这次实践的经验是:Windows记事本真是垃圾。
后附关于utf8和utf8mb4编码的二三事。
1.错误尝试汇总
之前一直使用windows自带的记事本改编码格式,但是这次导入csv文件时怎么都会报错,1300和1366都会出现,就发现可能是编码格式没有改过来导致的。
测试一:
创建Charset为国标2312的表,然后导入gb2312的csv文件,这样做正常情况下可以成功,但遇到生僻字时就会发生报错,故舍弃。
测试二:
创建utf8mb4的表,用windows记事本更改编码格式为utf8后进行导入,报错,查询各种资料后仍无结果,就开始考虑是不是编码格式没变过去的原因,
因为utf8也可以表示中文。
2.正确解决办法
下载notepad++(虽然这个软件的作者是个湾湾而且辱华,用起来有点膈应,但是因为没找到合适替代就先暂时使用了。),使用notepad++更改编码格式为utf8,1
2
3
4
5
6
7
8load data infile 'C:/ProgramData/MySQL/MySQL Server 8.0/Data/db2.csv'
into table tb2 char set utf8mb4
fields terminated by ',' optionally enclosed by '"' escaped by '"'
lines terminated by '\r\n'
ignore 1 lines;
用以上SQL代码导入csv到tb2即可。
3.关于utf8和utf8mb4的一些资料,供初学者参考。
UTF8:
Unicode为万国码,目的是为了可以在一篇文章中同时出现多种不同国家的文字,且不管使用什么设备,在哪个国家,都能让其正确显示文字。
UTF-8编码中的汉字,由3~4个字节表示,大部分为3个字节。基本汉字的编码范围为4E00-9FA5,如4E00转换为二进制为01001110 00000000,从后往前套模板发现最少需要三个字节。
Unicode标准里,汉字被整成了CJK概念,中日韩统一表意文字,简体字和繁体字被弄到了一块,如“国”和“國”编码分别为56FD和570B,两个编码挨得非常近。
MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
UTF8和UTF8mb4:
既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。