4521


失礼します。

windows8.1でmysql5.1を使用しています。

現在、mysqlでutf8の設定ができずに困っています。  
症状としては、  
・データベース作成時点でutf8を指定、set names utf8を実行した状態で  
insert文で日本語を含むデータを入れようとしたところ、日本語のデータを追加しようとしたカラムのみエラーが出る。  
・chcp 65001を指定した状態でmysqlを起動(?実行?)してinsert文でデータを追加しようとしたところ、  
そもそも日本語入力ができない。  
・mysqlを起動(?実行?)しない状態でchcpコマンドを実行すると932(たぶんsjis)と表示される。  
・my.cnfが存在しない

以上の4点となります。

3つ目の症状より、デフォルトの文字コードがsjisになっているのではないかと考えているので、my.cnfの設定を変更しようと思ったのですが、cドライブからmy.cnfを検索しても出てこないのでおそらく存在しません。  
調べてみたところどうやら自分で作ればいいらしいのですが、mysql5.1のサンプルコードが見つからなかったのもあり、どこに作ればいいのか、記述はどうしたらいいのかが分からず困っています。

utf8の設定をすることができないので、この状況を打開するためにまずmy.cnfを作るところから始めるとは思うのですが、どこにどう作ったらよいでしょうか？

追記：nyaru_kさんの指示通りにmy.iniを編集し、新たにデータベースとテーブルを作りました。  
まずは適応されているかの確認です。

[code]

    mysql> show variables like 'char%';
    +--------------------------+---------------------------------------------------------------+
    | 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       | C:\Program Files (x86)\MySQL\MySQL Server 5.1\share\charsets\ |
    +--------------------------+---------------------------------------------------------------+
    8 rows in set (0.00 sec)
    
[/code]

続いてはinsert文で日本語のデータを入れようとした結果です。

[code]

    mysql> insert into goods values
        -> (1,'りんご',200),(2,'みかん',100);
    ERROR 1366 (HY000): Incorrect string value: '\x82\xE8\x82\xF1\x82\xB2' for column 'name' at row 1
    
[/code]

my.iniを編集する前も全く同じエラーになっていました。  
原因が分かりますでしょうか？

追記2：  
phpでinsert文も試しましたが、utf8をset namesで指定すると文字化け、sjisだと日本語で表示されました。

my.iniはMySQL Server 5.1の直下にあります。

使用しているエディタはSublime Textで、上書き保存をするときに「エンコードを指定して上書き保存」でUTF-8を選択して保存しています。


CC BY-SA 3.0
2015-01-13T06:03:20.110
4482
2015-01-14T05:27:16.870
2015-01-14T05:27:16.870
5985
5985
question
mysql
mysql5.1で文字コードをutf8に設定する方法


コマンドプロンプトで UTF-8 を扱う場合、`chcp` を実行するだけでなく、コマンドプロンプトのプロパティで MS
ゴシックなどの日本語対応のフォントに切り替える必要があります。my.cnf で設定した文字コードが反映されているか確認するには `SHOW
VARIABLES` 文を使います。

[code]

    SHOW VARIABLES
        WHERE Variable_name
        LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
    
[/code]

テーブル定義に文字コードが指定されているかを調べるには `SHOW CREATE TABLE` 文を使います。

[code]

    SHOW CREATE TABLE yourTable\G;
    
[/code]

my.cnf を修正しても反映されないのであれば、mysql コマンドが読み込むパスに設置していない、もしくは複数の my.cnf
が存在する可能性があります。

日本語しか使わないのであれば、コマンドプロンプトおよび MySQL クライアントの両方で CP932 を使う選択肢もあります。

[code]

    SET NAMES cp932;
    
[/code]

MySQL
の設定がうまくいったものの、コマンドプロンプトの表示設定がうまくゆかないのであれば、文字リテラルを使ってデータを投入することも考える必要があるかもしれません。たとえば「あ」(U+3042)
の文字リテラルは次のように表現されます。

[code]

    SELECT _ucs2 x'3042', _utf8 x'E38182', 0xE38182;
    
[/code]

結果の文字列は HEX 関数で16進数に変換すればおよそ判断がつきます。PHP で16進数の文字列を生成したり、復元するには `base64_encode`
および `base64_decode` を使います。

[code]

    SELECT HEX(0xE38182);
    
[/code]

utf8 のテーブルを使う場合、将来において utf8mb4 に移行する必要があります。utf8 (utf8mb3)
では絵文字や第三・四水準漢字の一部の4バイト文字 (U+10000 から U+10FFFF)
をそのまま保存できないからです。これらの文字を保存するにはサロゲートペアに変換するか (たとえば、U+1F436 であれば U+D83D
U+DC36)、HTML 数値文字参照 (例: &#x1F436;) に変換する必要があります。


CC BY-SA 3.0
2015-01-13T10:05:17.213
4501
2015-01-14T00:20:25.237
2015-01-14T00:20:25.237
568
568
4482
answer


windowsでは my.cnf ではなく my.ini という名前の場合があります．  
そのため，Cドライブを my.ini で検索してみると既にファイルが存在するかもしれません．

[code]

    mysql --help
    
[/code]

とすると，出力がそこそこ長いのですが，[ここ](https://stackoverflow.com/questions/4292769/what-is-
the-location-of-mysql-client-my-cnf-in-windows)の例を取ってくると，

[code]

    Default options are read from the following files in the given order:
    C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf 
    C:\Program Files\MySQL\MySQL Server 5.5\my.ini 
    C:\Program Files\MySQL\MySQL Server 5.5\my.cnf
    
[/code]

などと出力される部分があり，このいずれかに設定ファイルを置けば良いです．  
これをご自分の環境で試してみてください．  
ただし，複数ある場合は先頭のファイルから順に読み込まれ，  
設定が上書きされていくので注意してください．

utf8の設定に関しては，手元に環境がないのでちょっと試せないのですが，

[code]

    [client] 
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    [mysqld]
    default-character-set=utf8
    skip-character-set-client-handshake
    character-set-server=utf8
    collation-server=utf8_general_ci
    init-connect=SET NAMES utf8
    
[/code]

なとどするとできるのではないかと思います．  
（環境によって異なるような気がしますが…）

設定が反映されているかどうかの確認は，mysqlで

[code]

    show variables like 'char%';
    
[/code]

または，

[code]

    status
    
[/code]

と実行するといいと思います．

**追記**

> 続いてはinsert文で日本語のデータを入れようとした結果です。
[code]

>     mysql> insert into goods values
>         -> (1,'りんご',200),(2,'みかん',100);
>     ERROR 1366 (HY000): Incorrect string value: '\x82\xE8\x82\xF1\x82\xB2'
> for column 'name' at row 1
>  
[/code]

>
> my.iniを編集する前も全く同じエラーになっていました。  
>  原因が分かりますでしょうか？

mysql自体の文字コードはutf8になったようですが，  
既にあるテーブルの文字コードが以前の文字コードのままなのだと思います．

masakielasticさんの回答にもありますが，以下でテーブルの文字コードが調べられます．

> テーブル定義に文字コードが指定されているかを調べるには `SHOW CREATE TABLE` 文を使います。
[code]

>     SHOW CREATE TABLE yourTable\G;
>  
[/code]

変更に関しては，

[code]

    ALTER TABLE yourTable CHARSET=utf8;
    
[/code]

とすることでutf8に変更できます．


CC BY-SA 3.0
2015-01-14T03:45:22.997
4521
2015-01-14T05:20:28.080
2020-06-17T08:14:45.997
-1
5447
4482
answer