如何使用docker-compose更改mysql的默认字符集?

xan*_*-ye 11 mysql docker docker-compose

当我保存中文字符串时,mysql会出现错误"异常值:
(1366,"错误的字符串值:'\ xE5\xB0\x8F\xE6\x98\x8E'代表第1行的'name')",我检查了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)
Run Code Online (Sandbox Code Playgroud)

而且我的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"
Run Code Online (Sandbox Code Playgroud)

我知道如何使用my.cnf设置mysql的字符,但是如何在docker-compose.yml中执行此操作?谁知道这个?谢谢!

Jav*_*ias 20

你可以建立你自己的MySQL形象,你修改my.cnf文件,或修改与启动MySQL的守护进程的命令--character-set-server=utf8mb4--collation-server=utf8_unicode_ci.

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']
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的答案,尽管“mysqld”命令不是必需的。如果您使用`command: ['--character-set-server=utf8mb4', '--collat​​ion-server=utf8mb4_unicode_ci']`,它也可以工作。 (4认同)
  • 对于在 K8s 环境中到达这里的人来说,您需要附加到 `spec.containers` 中:`args: ["--character-set-server", "utf8mb4", "--collat​​ion-server", “utf8mb4_unicode_ci”]` (3认同)

Dra*_*phy 15

我阅读了 @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)
Run Code Online (Sandbox Code Playgroud)

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

command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
Run Code Online (Sandbox Code Playgroud)

整个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
Run Code Online (Sandbox Code Playgroud)

这是最终的输出。

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)
Run Code Online (Sandbox Code Playgroud)

参考


Jav*_*ias 6

如果您想使用上面的设置创建自己的 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"]
Run Code Online (Sandbox Code Playgroud)


Zie*_*zyk 6

@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/ |
+--------------------------+----------------------------+
Run Code Online (Sandbox Code Playgroud)

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

添加一项环境设置后: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/ |
+--------------------------+----------------------------+

Run Code Online (Sandbox Code Playgroud)

所以我认为最终的 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
Run Code Online (Sandbox Code Playgroud)

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