programing

도커 합성을 사용하여 mysql의 기본 문자 집합을 변경하는 방법은 무엇입니까?

lastcode 2023. 8. 10. 18:50
반응형

도커 합성을 사용하여 mysql의 기본 문자 집합을 변경하는 방법은 무엇입니까?

중국어 문자열을 저장하면 mysql에서 "예외값:
(1366, "1행의 '이름' 열에 대한 문자열 값: '\xE5\xB0\x8F\xE6\x98\x8E'") 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)

그리고 내 도커 컴포지.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의 문자를 설정하는 방법은 알고 있지만, 도커-compose.yml에서 어떻게 해야 합니까?이거 아는 사람?감사합니다!

my.cnf를 수정하는 자체 mysql 이미지를 구축하거나, 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']

utf8mb4는 "멀티바이트 문자당 4바이트"까지 저장할 수 있기 때문에 사용하는 것을 추천합니다(https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html) .

@Ziemowit Stolarczyk가 나열한 GitHub 이슈를 읽었습니다.그들 모두가 정확한 것은 아닙니다.GitHub의 대답은 다음과 같습니다.-e LANG=C.UTF-8도커-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)

언급

위의 설정을 사용하여 도커 이미지를 생성하려는 경우 도커 합성으로 지정하는 대신 다음과 같이 수행할 수 있습니다.

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"]

@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/ |
+--------------------------+----------------------------+

그것은 다음에 표시되는 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/ |
+--------------------------+----------------------------+

따라서 최종 도커-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 에서 이와 관련된 전체 스레드를 읽을 수 있습니다.

대부분의 답은 좋지만, 제가 찾은 올바른 캐릭터와 훌륭한 구조를 가진 최고의 도커 구성이 여기에 있을 것입니다.

version: '2'
services:
  mysql:
    image: mysql:5.7
    ports:
      - '3306:3306'
    volumes:
      - ./sql-scripts/:/docker-entrypoint-initdb.d/
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --skip-character-set-client-handshake
    environment:
      MYSQL_ROOT_PASSWORD: pass
      MYSQL_DATABASE: test

결과:

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

또한 SQL(및.sh의 파일sql-scipts시작하는 동안 디렉터리가 실행됩니다(예: 첫 번째 컨테이너 시작 시 기존 덤프 가져오기).

합성 파일은 컨테이너를 실행하는 데 사용되며 이미지를 빌드할 수 있습니다.도커 합성 파일 내의 이미지는 사용자 지정할 수 없습니다.mysql 이미지를 확장하는 사용자 지정 이미지를 생성해야 합니다.도커 파일 만들기:

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

그런 다음 이 이미지를 작성합니다.

docker build -t <image-name> .

작성 파일 업데이트:

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

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

docker-compose.yml에 명령을 설정하여 이 문제를 해결하려고 했습니다.

command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']

다양한 종류로, 하지만 어떤 마술적인 이유로 저에게 효과가 없었습니다.내 테이블들의 조합과 연결의 조합은 여전히latin1_swedish_ci가 colation_server였음에도 utf8_unicode_ci.

이 옵션을 mysql config file(my.cnf)로 직접 설정하고 my.cnf를 볼륨으로 설정하여 해결했습니다.

my.cnf:

[mysqld]
init_connect=‘SET collation_connection = utf8_unicode_ci’
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set = utf8

도커-docker.yml:

version: '3.1'

services:

  db:
    image: mariadb
    restart: always
    ports:
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=example
      - MYSQL_DATABASE=test
      - MYSQL_USER=testuser
      - MYSQL_PASSWORD=testpassword
    volumes:
      - ./my.cnf:/etc/mysql/my.cnf

이 예에서 p.s.my.cnf는 도커-docker.yml 근처에 있습니다.다른 폴더에 넣을 수 있지만 볼륨 부분의 경로를 변경해야 합니다.

저의 경우, 문제는 UTF-8 인코딩 없이 SQL-dump 파일을 내보냈기 때문에 올바른 문자를 사용하려면 수동으로 덤프를 수정해야 한다는 것이었습니다.

이것은 나에게 도움이 됩니다.

db:
image: mysql:8.0
restart: always
environment:
  LANG: C.UTF-8
  MYSQL_ROOT_PASSWORD: mysecretpassword
  MYSQL_DATABASE: web_servicedb
  MYSQL_USER: myuser
  MYSQL_PASSWORD: mypassword
  MYSQL_INITDB_CHARSET: utf8mb4

LANG 매개 변수가 마법을 만듭니다. 이 문제도 확인하십시오. https://github.com/docker-library/mysql/issues/131

언급URL : https://stackoverflow.com/questions/45729326/how-to-change-the-default-character-set-of-mysql-using-docker-compose

반응형