问题
下载了一个单词sql文件,导入mysql报错,查看文件类型:
% file english_word.sql
english_word.sql: Non-ISO extended-ASCII text
与另一个导入成功的文件对比,发现格式不一样:
% file english-root.sql
english-root.sql: UTF-8 Unicode text, with very long lines, with no line terminators
转换文件格式
-
直接转换报错:
iconv: 未知 41 处的非法输入序列
-
参考Linux 下文件Non-ISO extended-ASCII编码问题
iconv -f 源格式 -t UTF-8 原来的文件 > 新的文件
-
使用脚本查找适合的格式,只需要替换下面的
english_word.sql
:iconv --list | sed 's/\/\/$//' | sort > encodings.list for a in `cat encodings.list`; do printf "$a " iconv -f $a -t UTF-8 english_word.sql > /dev/null 2>&1 \ && echo "ok: $a" || echo "fail: $a" done | tee result.txt
执行后,
cat result.txt | grep -v fail | less
即是可用于转换的指定格式。 -
为了转换得到正常显示中文的文件,需要在结果中进一步搜索
GB
格式% cat result.txt | grep -v fail | grep GB EBCDIC-CP-GB ok: EBCDIC-CP-GB GB13000 ok: GB13000 GB18030 ok: GB18030 GBK ok: GBK
-
最终转换命令如下:
iconv -f GB18030 -t UTF-8 english_word.sql > my.sql
-
再次导入成功
mysql> select * from EnWords limit 10; +----------+--------------------------------------------------------------------------------------------------------------+ | word | explain | +----------+--------------------------------------------------------------------------------------------------------------+ | a | n.(A)As 或 A's 安(ampere);(a) art.一;n.字母A /[军] Analog.Digital,模拟/数字 /(=account of) 帐上 | | aaal | American Academy of Arts and Letters 美国艺术和文学学会 | | aachen | 亚琛[德意志联邦共和国西部城市] | | aacs | Airways and Air Communications Service (美国)航路与航空通讯联络处 | | aah | [军]Armored Artillery Howitzer,装甲榴弹炮;[军]Advanced Attack Helicopter,先进攻击直升机 | | aal | ATM Adaptation Layer,ATM适应层 | | aapamoor | n.[生]丘泽,高低位镶嵌沼泽 | | aapss | American Academy of Political and Social Science 美国政治和社会科学研究院 | | aar | n.阿勒河(位于瑞士中部,亦作Aare) | | aardvark | n.[动]土豚 | +----------+--------------------------------------------------------------------------------------------------------------+