前提・実現したいこと
Mysqlの結果をbashファイルで配列にしてechoすると、文字化けしてしまいます。
・Gitbash
・bashファイル
・Mysql5.7
①bashファイルでMysqlへ接続しテーブル情報を取得(Select文)
②Select結果を配列に変換
③配列の中身をテキストファイルに書き出す
配列にしているのは、配列の偶数番のみ追加したい処理があるからです。(今回のソースコードには記載していませんが)
該当のソースコード
#!/bin/bash var=$(mysql -u user pass <<EOF select name from table1; EOF ) array=(`echo $var`) for ((i=0; i<${#array[@]}; i++)) do echo ${array[i]} done > ./file.txt
DBから取得する情報は日本語なのですが、array.textで文字化けしてしまいます。
DB・テーブルの文字コードはUTF8
Gitbashの設定もUTF8
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_ALL=ja_JP.utf8
になっています。
試したこと
bashファイルでで配列arrayに入れず、以下のように取得したvarを直接テキストファイルに書き出すと文字化けはしません。なぜ配列にすると文字化けするのでしょうか?
#!/bin/bash var=$(mysql -u user pass <<EOF select name from table1; EOF ) echo ${var} > ./file.txt
追記
メモ帳で開く場合は BOM を先頭につけてください。
BOMつきで開いたところ、ローマ字の部分は文字化けが解消されました!
しかし漢字の部分の文字化けが未だ直らずです。
テキストファイルに書き出しせず、Gitbash上で配列の中身を表示しようとすると、この段階で文字化けしていました。
#!/bin/bash var=$(mysql -u user pass <<EOF select name from table1; EOF ) array=(`echo $var`) for ((i=0; i<${#array[@]}; i++)) do echo ${array[i]} done
ちなみに、Mysqlで
select name from table1;
を実行した際はGitbashでも文字化けしません。
解決方法
Mysqlへ接続した後、3行目のようにcharset_utf8
を書いたら文字化け解消されました。
何故かDBの文字コード設定が上手くいっていなかったようです。。。
#!/bin/bash var=$(mysql -u user pass <<EOF charset utf8; select name from table1; EOF ) array=(`echo $var`) for ((i=0; i<${#array[@]}; i++)) do echo ${array[i]} done > ./file.txt
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。