【问题标题】:How to change the default character set of mysql using docker-compose?如何使用 docker-compose 更改 mysql 的默认字符集?
【发布时间】:2017-08-17 07:45:46
【问题描述】:

当我保存中文字符串时,mysql出现错误“Exception Value:
(1366, "Incorrect string value: '\xE5\xB0\x8F\xE6\x98\x8E' for column 'name' at row 1")",我检查了 mysql 的字符,它显示:

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| 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.00 sec)

我的 docker-compose.yml 也是:

web:
    image: yetongxue/docker_test:1.2
    links:
      - "db"
    ports:
      - "8100:8000"
    volumes:
      - "/Users/yetongxue/docker_v/docker_test/media:/root/media"
    restart: always

db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: qwerasdf
      MYSQL_DATABASE: docker_db
    restart: always
    volumes:
      - "/Users/yetongxue/docker_v/docker_test/db:/var/lib/mysql"

我知道如何使用 my.cnf 设置 mysql 的字符,但是如何在 docker-compose.yml 中设置呢? 有人知道这个吗?谢谢!

【问题讨论】:

  • 感谢您提出这个问题。图片默认是latin1,太傻了!

标签: mysql docker docker-compose


【解决方案1】:

您可以在修改 my.cnf 的地方构建自己的 mysql 映像,也可以使用 --character-set-server=utf8mb4--collation-server=utf8_unicode_ci 修改启动 mysql 守护程序的命令。

web:
    image: yetongxue/docker_test:1.2
    links:
      - "db"
    ports:
      - "8100:8000"
    volumes:
      - "/Users/yetongxue/docker_v/docker_test/media:/root/media"
    restart: always

db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: qwerasdf
      MYSQL_DATABASE: docker_db
    restart: always
    volumes:
      - "/Users/yetongxue/docker_v/docker_test/db:/var/lib/mysql"
    command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']

我建议使用 utf8mb4,因为它最多可以存储“每个多字节字符 4 个字节”(https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)

【讨论】:

  • [ERROR] COLLATION 'utf8_unicode_ci' 对 CHARACTER SET 'utf8mb4' 无效
  • 尝试使用 character-set-server = utf8
  • 对于在 K8s 环境中来到这里的人来说,这里是您需要附加到 spec.containers 的内容:args: ["--character-set-server", "utf8mb4", "--collation-server", "utf8mb4_unicode_ci"]
  • 很好的答案,即使 mysqld 命令不是必需的。如果你改用command: ['--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci'],它也可以工作。
【解决方案2】:

我阅读了@Ziemowit Stolarczyk 列出的 GitHub 问题。所有这些都不完全正确。 GitHub 的答案是-e LANG=C.UTF-8。我在我的 docker-compose.yml 中使用它,但是 mysql 打印出来是这样的:

mysql>  show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

它不适用于数据库和服务器。所以我在 docker-compose.yml 中添加如下配置。

command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

整个yaml文件是:

version: "3"
services:
  mysql:
    container_name: mysql
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
      LANG: C.UTF-8
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3306:3306"
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

这是最终输出。

mysql>  show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| 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.01 sec)

参考

【讨论】:

    【解决方案3】:

    如果您想使用上述设置创建自己的 docker 映像,而不是在 docker-compose 中指定它们,您可以这样做:

    FROM mysql:5.5.60
    
    RUN ln -sf /usr/share/zoneinfo/Europe/London /etc/localtime
    
    VOLUME ["/docker-entrypoint-initdb.d"]
    
    CMD ["--character-set-server=utf8mb4", "--collation-server=utf8mb4_general_ci", "--skip-character-set-client-handshake"]
    

    【讨论】:

      【解决方案4】:

      @Javier Arias 的回答很好,但我的网站上仍然保留了一些非 utf8 设置,如下所示。

      mysql> show variables like "%char%";
      +--------------------------+----------------------------+
      | Variable_name            | Value                      |
      +--------------------------+----------------------------+
      | character_set_client     | latin1                     |
      | character_set_connection | latin1                     |
      | character_set_database   | utf8mb4                    |
      | character_set_filesystem | binary                     |
      | character_set_results    | latin1                     |
      | character_set_server     | utf8mb4                    |
      | character_set_system     | utf8                       |
      | character_sets_dir       | /usr/share/mysql/charsets/ |
      +--------------------------+----------------------------+
      

      它导致了一些与docker-compose exec mysql bash 之后显示的 utf8 字符相关的问题。

      添加一个 ENVIRONMENT 设置后:LANG: C.UTF_8 我得到:

      mysql> show variables like "%char%";
      +--------------------------+----------------------------+
      | Variable_name            | Value                      |
      +--------------------------+----------------------------+
      | character_set_client     | utf8                       |
      | character_set_connection | utf8                       |
      | character_set_database   | utf8mb4                    |
      | character_set_filesystem | binary                     |
      | character_set_results    | utf8                       |
      | character_set_server     | utf8mb4                    |
      | character_set_system     | utf8                       |
      | character_sets_dir       | /usr/share/mysql/charsets/ |
      +--------------------------+----------------------------+
      
      

      所以我认为最终的 docker-compose.yml 应该是:

      db:
          image: mysql:5.7
          environment:
            MYSQL_ROOT_PASSWORD: qwerasdf
            MYSQL_DATABASE: docker_db
            LANG: C.UTF_8  # this one should be added
          restart: always
          volumes:
            - "/Users/yetongxue/docker_v/docker_test/db:/var/lib/mysql"
          command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
      

      您可以在此处阅读与此相关的整个线程https://github.com/docker-library/mysql/issues/131

      【讨论】:

      • 如果可以的话,LANG 的 var env 应该是 C.UTF-8(带破折号)
      【解决方案5】:

      compose 文件用于运行容器(并且可以构建图像)。您无法自定义 docker-compose 文件中的图像。您需要创建一个扩展 mysql 图像的自定义图像。 创建一个 Dockerfile:

      FROM mysql:5.7
      RUN <command to update my.cnf>
      

      然后构建这个图像:

      docker build -t <image-name> .
      

      更新撰写文件:

      db:
          image: <image-name-specified-above>
      

      【讨论】:

      【解决方案6】:

      尝试使用 character-set-server = utf8

      docker run --name mysql-server -t -e MYSQL_DATABASE="docker_db" -e MYSQL_USER="username" -e MYSQL_PASSWORD="qwerasdf" -e MYSQL_ROOT_PASSWORD="YjA0OTYwZDBiN2EwNWFjMTRjZGU3Yjcy" -d mysql --character-set-server=utf8 --collation-server=utf8_bin --default-authentication-plugin=mysql_native_password
      

      【讨论】:

        【解决方案7】:

        在我的例子中,问题是我的 SQL 转储文件在没有 UTF-8 编码的情况下被导出,我必须手动修复转储以包含正确的字符。

        【讨论】:

          猜你喜欢
          • 2012-02-12
          • 2012-01-30
          • 2018-11-13
          • 2022-01-17
          • 2015-09-29
          • 2012-08-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多