假设我执行如下的 SQL 语句将 “ E:\哈哈哈.txt ” 文件的内容导入到 test.test1 表中:
LOAD DATA LOCAL INFILE 'E:\哈哈哈.txt' INTO TABLE test.test1
很遗憾,结果告诉我无法执行此 SQL 语句,原因是 File xxx not found (Errcode: 22 "Invalid argument") :
但是我可以肯定此文件是存在的,而且当我将 “ E:\哈哈哈.txt ” 文件的文件名改成英文名的时候,就可以正常执行,所以我敢肯定这跟字符的编码有着很大的关系。
解决方法
发生这种错误的原因是因为 MySQL 在使用 LOAD DATA 加载文件的时候,解析文件名所使用的字符集与文件名本身所使用的字符集是不匹配的,所以 MySQL 解析中文文件名的结果其实是乱码的,所以就导致 MySQL 无法找到在操作系统中找到对应的文件。
首先要明确的是我的操作系统(win 10)当前所使用的字符集为 GBK,然后我通过 show variables like '%char%' 来查看当前 MySQL 的字符集使用情况:
这里要明确的是 MySQL 解析文件名所使用的字符集就是 character_set_filesystem 所指定的字符集,当 character_set_filesystem 的值为 binary 的时候,将会默认使用 character_set_client 所指定的字符集来解析文件名,从上图中可以看出,其实 MySQL 是采用 utf-8 来解析 “ 哈哈哈.txt ”,而不是 " 哈哈哈.txt " 本身所使用的 GBK ,所以 MySQL 解析文件名的时候返回的就是一堆乱码,所以最后就提示 File xxx not found。
关于 character_set_filesystem 的具体介绍请移步 mysql 中有关字符集 character_set_xxx 系统参数的整理
所以这个时候只要将 character_set_filesystem 的字符集修改成操作系统所使用的字符集就 OK 了:
set @@character_set_filesystem=gbk
这个时候再查看一下 show variables like '%char%' :
可见这时候 character_set_filesystem 的值已经被修改成了 gbk,所以这时候 MySQL 就会使用 gbk 去解析文件名,最后 LOAD DATA 就可以成功加载文件了: