38347


MySQLからの出力が、

  1. 直接sqlを実行すると化けない
  2. シェルスクリプトから実行すると、文字化けする

という現象に困っています。  
シェルのロケールの問題かと思うのですが、  
今のところ解決しておりません。  
もしお知恵をお貸しいただけるなら助かります。  
以下、サンプルコードと環境を記しておきます。

* * *

次のようなテーブルを作成し、データをINSERTしたとします。

[code]

    CREATE TABLE sori (
           ID int NOT NULL UNIQUE, 
           name varchar(50)
    );
    
    INSERT INTO sori (ID, name) VALUES (0, '安部晋三');
    
[/code]

出力用のファイルを用意します。

[code]

    $ cat backup.sql 
    use test;
    
    SELECT * FROM sori ORDER BY ID;
    
[/code]

上記のsqlを実行するシェルスクリプトです。(ユーザ名を隠してあります)

[code]

    $ cat backup.sh 
    #!/bin/sh
    
    output_file_name=/home/***/test.data
    mysql -u root -p < /home/***/backup.sql > $output_file_name
    
[/code]

直接、sqlを実行すると、文字化けしません。

[code]

    $ mysql -u root -p < backup.sql > test2.data
    Enter password: 
    
    $ cat test2.data 
    ID  name
    0   安部晋三
    
[/code]

次に、シェルスクリプトを介して、出力します。

[code]

    olive:~$ ./backup.sh 
    Enter password: 
    
    $ cat test.data 
    ID  name
    0   å®‰éƒ¨æ™‹ä¸‰
    
[/code]

こんな感じです。

ロケールですが、

[code]

    $ echo $LANG
    ja_JP.utf8
    
[/code]

となっております。

最後に環境です。

[code]

    $ cat /etc/redhat-release 
    CentOS Linux release 7.3.1611 (Core) 
    
    $ rpm -qa | grep mysql
    mysql-community-libs-5.6.37-2.el7.x86_64
    mysql-community-devel-5.6.37-2.el7.x86_64
    mysql-community-release-el7-5.noarch
    php-mysql-5.4.45-13.el7.remi.x86_64
    mysql-community-client-5.6.37-2.el7.x86_64
    mysql-connector-odbc-5.3.9-1.el7.x86_64
    mysql-community-common-5.6.37-2.el7.x86_64
    mysql-community-server-5.6.37-2.el7.x86_64
    
[/code]

よろしくお願いします。


CC BY-SA 3.0
2017-10-01T13:57:51.220
38340
2017-10-23T08:07:34.473
2017-10-23T08:06:48.193
question
linux mysql centos
MySQLからの出力が文字化けする(シェルスクリプト利用時)


テーブル定義のカラムのcharsetがlatin1になっているような感じに見えます。

`show create table sori;` でテーブルの charset が確認できると思います。

直接SQL実行時とシェルスクリプト実行時とで実行しているユーザーは同一でしょうか。  
もし異なるのであれば `$HOME/.my.cnf` に違いはないでしょうか。

あと LANG 以外の LC_* の環境変数にも影響を受けます。


CC BY-SA 3.0
2017-10-02T00:22:04.090
38347
2017-10-02T00:57:08.430
2017-10-02T00:57:08.430
3249
3249
38340
answer


解決しました。  
状況と行ったことを記しておきます。

\--初期の状態--

[code]

    mysql> show create table sori; 
    
    | Table | Create Table                                                                        
    | sori  | CREATE TABLE `sori` (
      `ID` int(11) NOT NULL,
      `name` varchar(50) DEFAULT NULL,
      UNIQUE KEY `ID` (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
    
    mysql> show variables like "chara%";
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | latin1                     |
    | character_set_connection | latin1                     |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | latin1                     |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.07 sec)
    
[/code]

\--行ったこと--  
* my.cnfの編集 (以下を追加)
[code]

    [mysqld]
    character-set-server=utf8
    [client]
    default-character-set=utf8
    
[/code]

  * データベースの変更

mysql> ALTER DATABASE `test` default character set utf8;

  * character_set_server を設定

mysql> set character_set_server = utf8;

  * テーブルsoriを一度破棄し、同じCREATE文で作り直す

  * 同じINSERT文で、データを入れ直す

\--現在の状況--

[code]

    mysql> show create table sori;
    | Table | Create     Table                                                                        
    | sori  | CREATE TABLE `sori` (
      `ID` int(11) NOT NULL,
      `name` varchar(50) DEFAULT NULL,
      UNIQUE KEY `ID` (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    
    
    mysql> show variables like 'character%';
    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | utf8                       |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | utf8                       |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    
[/code]

\--再試行--

[code]

    $ ./backup.sh 
    Enter password: 
    $ ls -l test.data 
    -rw-rw-r-- 1 *** *** 23 10月 22 16:12 test.data
    
    $ cat test.data 
    ID  name
    0   安部晋三
    
[/code]


CC BY-SA 3.0
2017-10-23T08:07:34.473
38972
2017-10-23T08:07:34.473
38340
answer