MariaDB INSERT с данными в кириллице из MS Windows console (cp1252) не принимается

Требуется помощь с определением источника проблемы вставки данных в кириллице в консольном клиенте на MS Windows (cp1252).

  • Операционная система Windows 10 с кодовой страницей cp1252 (North America)
  • Установлена XAMPP (Control panel v3.2.4)
  • Из управляющей панели XAMPP запускается console
  • Переходим на utf8 кодовую страницу chcp 65001
  • Запускаю mysql --default-character-set=utf8 -u root -p
  • Пытаюсь вставить INSERT INTO x_test (title) VALUES ('проба')
  • Команда указывает на ' и находится в режиме ожидания

База данных создана командой

CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Таблица создана следующей командой

CREATE TABLE `x_test` (
  `title` varchar(32) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

По рекомендациям найденым в интернете дополнительно делается

MariaDB [test]> SET NAMES utf8;
Query OK, 0 rows affected (0.000 sec)

Делается INSERT с латинницей (все прекрасно)

MariaDB [test]> INSERT INTO x_test (`title`) VALUES ('proba');
Query OK, 1 row affected (0.117 sec)

Попытка INSERT с кириллицей ждет '

MariaDB [test]> INSERT INTO x_test (`title`) VALUES ('проба');
    '>

Переменные сессии следующие

MariaDB [test]> SHOW SESSION VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------+
| Variable_name            | Value                                        |
+--------------------------+----------------------------------------------+
| character_set_client     | utf8                                         |
| character_set_connection | utf8                                         |
| character_set_database   | utf8                                         |
| character_set_filesystem | binary                                       |
| character_set_results    | utf8                                         |
| character_set_server     | utf8                                         |
| character_set_system     | utf8                                         |
| character_sets_dir       | C:\bin\XAMPP\App\xampp\mysql\share\charsets\ |
+--------------------------+----------------------------------------------+
8 rows in set (0.001 sec)

Данные прекрасно вставляются через perl script, php script, HeidiSQL клиент.

SELECT в консоле с уже вставленными данными прекрасно выдает существующие данные

MariaDB [test]> select * from x_test;
+--------------+
| title        |
+--------------+
| проба        |
| проба        |
| проба        |
| Андрей       |
| Андрей       |
| Андрей       |
| natasha      |
| proba        |
+--------------+
8 rows in set (0.000 sec)

В чем проблема с консолью и как её исправить?

Session log

John Smith@WORKSTATION c:\bin\xampp\app\xampp
# chcp
Active code page: 437

John Smith@WORKSTATION c:\bin\xampp\app\xampp
# mysql --default-character-set=utf8 -u root -p
Enter password: ******
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 24
Server version: 10.4.10-MariaDB mariadb.org binary distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE `x_test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Query OK, 1 row affected (0.002 sec)

MariaDB [(none)]> use x_test
Database changed
MariaDB [x_test]> SHOW SESSION VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------------------------+
| Variable_name            | Value                                        |
+--------------------------+----------------------------------------------+
| character_set_client     | utf8                                         |
| character_set_connection | utf8                                         |
| character_set_database   | utf8                                         |
| character_set_filesystem | binary                                       |
| character_set_results    | utf8                                         |
| character_set_server     | utf8                                         |
| character_set_system     | utf8                                         |
| character_sets_dir       | C:\bin\XAMPP\App\xampp\mysql\share\charsets\ |
+--------------------------+----------------------------------------------+
8 rows in set (0.001 sec)

MariaDB [x_test]> CREATE TABLE `x_test` (
    -> `title` varchar(32) COLLATE utf8_unicode_ci NOT NULL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Query OK, 0 rows affected (0.420 sec)

MariaDB [x_test]> INSERT INTO x_test (`title`) VALUES ('proba');
Query OK, 1 row affected (0.056 sec)

MariaDB [x_test]> INSERT INTO x_test (`title`) VALUES ('проба');
Query OK, 1 row affected (0.049 sec)

MariaDB [x_test]> select * from x_test;
+-------+
| title |
+-------+
| proba |
| ????? |
+-------+
2 rows in set (0.000 sec)

MariaDB [x_test]> \q
Bye

John Smith@WORKSTATION c:\bin\xampp\app\xampp
#

Ответы (1 шт):

Автор решения: Akina

В MySQL подобного не наблюдается... версия 8.0.16, кодировка консоли 1251, в командной строке проверены "--default-character-set=utf8" и CP1251.

12.11.2020 c:\tmp
>chcp
Текущая кодовая страница: 1251

12.11.2020 c:\tmp
>cd "C:\Program Files\MySQL\MySQL Server 8.0\bin\"

12.11.2020 C:\Program Files\MySQL\MySQL Server 8.0\bin
>"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" "-uakina" "-p" "--default-character-set=utf8"
Logging to file 'C:\Temporary\mysql80_console.log'
Enter password: *******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 14
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

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> CREATE DATABASE `x_test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Query OK, 1 row affected, 2 warnings (0.19 sec)

mysql> use x_test
Database changed
mysql> SHOW SESSION VARIABLES LIKE 'character_set%';
+--------------------------+---------------------------------------------------------+
| Variable_name            | Value                                                   |
+--------------------------+---------------------------------------------------------+
| character_set_client     | utf8                                                    |
| character_set_connection | utf8                                                    |
| character_set_database   | utf8                                                    |
| character_set_filesystem | binary                                                  |
| character_set_results    | utf8                                                    |
| character_set_server     | utf8mb4                                                 |
| character_set_system     | utf8                                                    |
| character_sets_dir       | C:\Program Files\MySQL\MySQL Server 8.0\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set, 1 warning (0.01 sec)

mysql> CREATE TABLE `x_test` (
    ->   `title` varchar(32) COLLATE utf8_unicode_ci NOT NULL
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Query OK, 0 rows affected, 3 warnings (0.69 sec)

mysql> INSERT INTO x_test (`title`) VALUES ('proba');
Query OK, 1 row affected (0.12 sec)

mysql> INSERT INTO x_test (`title`) VALUES ('проба');
Query OK, 1 row affected (0.21 sec)

mysql> select * from x_test;
+------------+
| title      |
+------------+
| proba      |
| проба      |
+------------+
2 rows in set (0.00 sec)

mysql> exit
Bye

12.11.2020 C:\Program Files\MySQL\MySQL Server 8.0\bin
>

Выложите аналогичный лог в своём случае.

PS. Все варнинги связаны с тем, что UTF8 есть алиас UTF8MB3, но скоро станет алиасом UTF8MB4, а нынешний вообще попадёт под deprecated.

→ Ссылка