22187


gormを使ってmysqlにデータを入れようとしています。

[code]

    db, _ := gorm.Open("mysql", "user:password@/dbname?charset=utf8&parseTime=True&loc=Local")
    file, err := os.Open("./db/seed.csv")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    
    reader := csv.NewReader(file)
    
    var upon models.Upon
    for {
        row, err := reader.Read()
        if err == io.EOF {
            break
        } else if err != nil {
            panic(err)
        }
        upon = models.Upon{Name: row[0], Kana: row[1]}
        db.Create(&upon)
    }
    
[/code]

上記のコードを実行すると、`(Error 1366: Incorrect string value:
'\xF0\x9F\x8F\x8A\xF0\x9F...' for column 'name' at row 1)`というエラーがでてしまいます。

[code]

    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     | utf8mb4                    |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+
    8 rows in set (0.00 sec)
    
    mysql> show create table upons;
    +-------+---------------------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                                          |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------+
    | upons | CREATE TABLE `upons` (
      `name` varchar(255) DEFAULT NULL,
      `kana` varchar(255) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
    +-------+---------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
[/code]

mysqlの文字コードはutf8になっています。

上記のプログラムはdockerを使って実行しています。  
mysqlのコンテナーに、golangのコンテナーからつないでいます。  
両方とも公式のimageです。

ぜひご教授ください。

**追記**  
のような絵文字でエラーが出ていました。


CC BY-SA 3.0
2016-02-17T00:17:21.120
22184
2016-02-17T05:14:08.733
2016-02-17T05:14:08.733
10492
8355
question
mysql go docker gorm
GORM で MySQL にデータを保存するときに Incorrect string value が出る原因を知りたい


「」のような絵文字はだいたい4バイト文字です。MySQL の utf8 は3バイト文字までしか扱えないので、utf8mb4 を指定する必要があります。  
upons テーブルは utf8mb4 になっているので問題ないのですが、接続の charset が utf8 になっています。  
1行目の gorm.Open の引数の charset=utf8 を charset=utf8mb4 にすればいいと思います。


CC BY-SA 3.0
2016-02-17T01:36:53.260
22187
2016-02-17T01:36:53.260
3249
22184
answer