繁体   English   中英

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

[英]How to change the default character set of mysql using docker-compose?

当我保存中文字符串时,mysql出现错误“异常值:
(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 中执行此操作? 有人知道这个吗? 谢谢!

您可以在修改 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

如果您想使用上述设置创建自己的 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"]

我阅读了 GitHub 问题,因为@Ziemowit Stolarczyk 列出了。 所有这些都不完全正确。 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)

参考

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>

@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 字符相关的问题。

添加一项环境设置后: 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阅读与此相关的整个线程。

就我而言,问题是我的 SQL 转储文件导出时没有使用 UTF-8 编码,我必须手动修复转储以获得正确的字符。

尝试使用字符集服务器 = 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM