Дамп Python + Sqlite3, исходный код для MariaDB: неизвестное сопоставление: 'utf8mb4_0900_ai_ci' (db noob)

Я слежу за Head First Python (3ed). Я на последней главе, и у меня есть ошибка, которую я не могу пройти.

У меня есть база данных sqlite3, которую мне нужно перенести в MariaDB. У меня есть схема и данные в отдельных файлах:

sqlite3 CoachDB.sqlite3 .schema > schema.sql
sqlite3 CoachDB.sqlite3 '.dump swimmers events times --data-only' > data.sql

Я установил MariaDB через apt, предоставил пользователю привилегии и вошел в систему, чтобы получить приглашение MariaDB:

mariadb -u swimuser -p swimDB

source schema.sql;
source data.sql;

Теперь я запускаю свое приложение Python локально, которое подключается к MariaDB, но, и я не уверен, где именно, вызов завершается с ошибкой:

mysql.connector.errors.DatabaseError: 1273 (HY000): неизвестные параметры сортировки: 'utf8mb4_0900_ai_ci'

Вернемся к приглашению MariaDB:

show collation like 'utf8%'; # не показывает параметры сортировки 'utf8mb4_0900_ai_ci'

select * from INFORMATION_SCHEMA.SCHEMATA; # показывает, что по умолчанию — utf8mb4 / utf8mb4_uca1400_ai_ci

В приглашении оболочки file -i schema.sql показывает, что это обычный текст в us-ascii. Я попытался открыть Schema.sql и data.sql в notepadqq и сохранить их как utf8, но все равно получил ту же ошибку. Я удалил базу данных и воссоздал ее с помощью:

CREATE DATABASE swimDB
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_520_ci;

...затем снова получил файлы Schema.sql и data.sql и все равно получил ту же ошибку.

Я видел пост, где кто-то об этом просил, так что...

MariaDB [swimDB]> SHOW VARIABLES WHERE VALUE LIKE 'utf%';
+--------------------------+-------------------------------+
| Variable_name            | Value                         |
+--------------------------+-------------------------------+
| character_set_client     | utf8mb3                       |
| character_set_collations | utf8mb4=utf8mb4_uca1400_ai_ci |
| character_set_connection | utf8mb3                       |
| character_set_database   | utf8mb4                       |
| character_set_results    | utf8mb3                       |
| character_set_server     | utf8mb4                       |
| character_set_system     | utf8mb3                       |
| collation_connection     | utf8mb3_general_ci            |
| collation_database       | utf8mb4_uca1400_ai_ci         |
| collation_server         | utf8mb4_uca1400_ai_ci         |
| old_mode                 | UTF8_IS_UTF8MB3               |
+--------------------------+-------------------------------+

Итак, я предполагаю, что в данных есть проблема с набором символов или кодировкой (?).

На данный момент я потерялся, безумно ища в сети подсказки. Любая помощь приветствуется и извините за длинный пост :)

Настраиваете ли вы свое приложение Python на использование соответствующего значения для сортировки? Возможно, есть какие-то настройки по умолчанию, которые вам нужно изменить или переопределить?

Grismar 12.08.2024 01:23

Может быть. У меня нет явного кода Python для сортировки. Не знал бы, с чего начать. Есть только словарь, который я передаю в DBcm.UseDatabase( { "host": "127.0.0.1", "database": "swimDB", "user": "swimuser", "password": "xxx", } )

CraigFoote 12.08.2024 01:27

Возможно, вместо этого используйте MariaDB Connector/Python. utf8mb4_0900_ai_ci не поддерживается MariaDB — есть более новая версия utf8mb4_1400_ai_ci. Рекомендуется использовать это правило сортировки по умолчанию в базе данных.

danblack 12.08.2024 01:52

Я добавил db.set_charset_collation('utf8mb4_uca1400_ai_ci'), но все равно получаю ту же ошибку. Пробовал db.set_charset_collation('utf8mb4') тоже. Я посмотрю на MariaDB Connector/Python. Спасибо.

CraigFoote 12.08.2024 02:07

Добавлено также для выбора операторов. SQL_SESSIONS = """ выбрать отдельные TS из времен сопоставления utf8mb4_uca1400_ai_ci; """ Та же ошибка.

CraigFoote 12.08.2024 02:15

Добавлено «сопоставление»: "utf8mb4_uca1400_ai_ci" в dict Connection, и теперь я получаю DBcm.CredentialsError: Collation 'utf8mb4_uca1400_ai_ci' unknown. :( Но он указан в show collation.

CraigFoote 12.08.2024 14:05

Связанный: stackoverflow.com/questions/78859228/… (странное совпадение, что оба были опубликованы примерно в одно и то же время).

Barmar 12.08.2024 17:37

Только что попробовал MariaDB Connector/Python, и все работает. @danblack, если ты хочешь опубликовать ответ, я отмечу это как отвеченное.

CraigFoote 12.08.2024 18:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
8
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

MySQL Connector, похоже, принудительно использует параметры сортировки, которых нет в MariaDB (utf8mb4_0900_ai_ci).

Судя по комментариям, похоже, что попытка принудительно использовать более позднюю сортировку MariaDB utf8mb4_uca1400_ai_ci для соединения, по-видимому, не разрешает соединение.

MariaDB Connector/Python он фактически протестирован на сервере MariaDB. В соответствии с Спецификацией API базы данных Python v2.0 (PEP 249) он должен быть совместим с соединителем MySQL (Python) в качестве заменяющего модуля подключения для вашего сервера и приложения MariaDB.

Другие вопросы по теме