导入mysql 乱码问题及 Linux 中的文件格式转换

问题

下载了一个单词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.[动]土豚                                                                                                   |
    +----------+--------------------------------------------------------------------------------------------------------------+
    
posted @ 2023-08-01 12:04  武平宁  阅读(193)  评论(0)    收藏  举报