У меня возникла проблема с работой символов UTF-8 в командной строке MySQL, когда я запускаю MySQL 8 в контейнере Docker.
Когда я копирую и вставляю символ UTF-8 в Терминал, этот символ удаляется.
Например
mysql> INSERT INTO your_table (name) VALUES ('🤌');
становится
mysql> INSERT INTO your_table (name) VALUES ('');
Я попробовал три разных способа настройки Docker-контейнера, и все они дали один и тот же результат. Я пробовал использовать кодировки по умолчанию, параметры командной строки (согласно документации ) и собственный файл my.cnf.
Я вижу изменение переменных набора символов MySQL, но не могу копировать и вставлять символы UTF-8 в командную строку MySQL. Однако я могу копировать и вставлять символы UTF-8 через командную строку MySQL для своей локальной базы данных MySQL 5.7, а также добавлять символы UTF-8 во все три базы данных с помощью подключаемого модуля браузера Intell-J DB.
Это проблема с настройкой образа Docker для инструмента командной строки MySQL?
Есть идеи?
Подробности тестов ниже:
1 Кодировки не указаны:
% docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 9306:3306 -d mysql:8
% docker exec -it some-mysql mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.33 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| 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 | utf8mb3 |
| collation_connection | latin1_swedish_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
+--------------------------+--------------------+
10 rows in set (0.05 sec)
mysql> INSERT INTO your_table (name) VALUES ('');
2 Конфигурация без файла конфигурации (с использованием параметров командной строки для установки набора символов)
% docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 9306:3306 -d mysql:8 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
% docker exec -it some-mysql mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.33 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| 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 | utf8mb3 |
| collation_connection | latin1_swedish_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.18 sec)
mysql> INSERT INTO your_table (name) VALUES ('');
3 Использование файла конфигурации MySQL
% cat /Users/me/Code/xxx/docker/mysql/conf.d/my.cnf
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
% docker run --name some-mysql -v /Users/me/Code/xxx/docker/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 7306:3306 -d mysql:8
% docker exec -it some-mysql mysql -uroot -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.33 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------------------+
| 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 | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------------------+
11 rows in set (0.01 sec)
mysql> INSERT INTO your_table (name) VALUES ('');
@Санни, спасибо, я отредактировал файл my.cnf, как вы предложили, и все еще не могу использовать UTF-8 в командной строке MySQL.
Мне жаль, что это не сработало, но я рад видеть, что вы нашли решение самостоятельно. Ваше здоровье. :)






Проблема была двоякая:
Я создал собственный образ MySQL 8, используя этот Dockerfile, который использовал установку Debian для копирования системных шрифтов:
# Stage 1: Use Debian to install locales and fonts
FROM debian:latest as build
# Install locales and fonts
RUN apt-get update && \
apt-get install -y locales fonts-dejavu-core && \
locale-gen C.UTF-8 || true && \
dpkg-reconfigure --frontend=noninteractive locales && \
update-locale LANG=C.UTF-8
# Stage 2: Use official MySQL image as the base image
FROM mysql:8
# Set environment variables for UTF-8 locale
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
# Copy locales and fonts from the build stage
COPY --from=build /usr/share/fonts /usr/share/fonts
COPY --from=build /usr/lib/locale /usr/lib/locale
COPY --from=build /usr/bin/locale /usr/bin/locale
COPY --from=build /usr/sbin/locale-gen /usr/sbin/locale-gen
COPY --from=build /etc/locale.gen /etc/locale.gen
COPY --from=build /usr/bin/localedef /usr/bin/localedef
# Expose MySQL port
EXPOSE 3306
# Set default command
CMD ["mysqld"]
Я создал собственный образ Docker с помощью этой команды:
docker build -t custom-mysql:8 .
Я создал новый контейнер Docker, используя этот образ:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=root -p 9306:3306 -d custom-mysql:8
Когда я вошел в инструмент командной строки MySQL, я наконец смог скопировать и вставить символы UTF-8:
% docker exec -it some-mysql mysql -u root -proot
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.33 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> INSERT INTO your_table (name) VALUES ('🤌');
Не могли бы вы попробовать изменить mysqld в файле my.cnf так: [mysqld] набор символов-сервера = utf8 сервер сопоставления = utf8_unicode_ci Skip-character-set-client-handshake