도커 합성을 사용하여 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)
언급
- https://github.com/docker-library/mysql/issues/131#issuecomment-248412170
- https://stackoverflow.com/a/66419629/13430829
위의 설정을 사용하여 도커 이미지를 생성하려는 경우 도커 합성으로 지정하는 대신 다음과 같이 수행할 수 있습니다.
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
'programing' 카테고리의 다른 글
CodeIgniter의 활성 레코드 메서드를 사용하여 ORDER BY 절을 추가하는 방법은 무엇입니까? (0) | 2023.08.10 |
---|---|
사용 후 DB Command를 폐기해야 합니까? (0) | 2023.08.10 |
assert(0)의 의미는 무엇입니까? (0) | 2023.08.10 |
도커에서 종속된 하위 이미지 목록을 가져오는 방법은 무엇입니까? (0) | 2023.08.05 |
Android Studio, 앱 종료 후 로그캣 청소 (0) | 2023.08.05 |