Я слежу за 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 для сортировки. Не знал бы, с чего начать. Есть только словарь, который я передаю в DBcm.UseDatabase( { "host": "127.0.0.1", "database": "swimDB", "user": "swimuser", "password": "xxx", } )
Возможно, вместо этого используйте MariaDB Connector/Python. utf8mb4_0900_ai_ci
не поддерживается MariaDB — есть более новая версия utf8mb4_1400_ai_ci. Рекомендуется использовать это правило сортировки по умолчанию в базе данных.
Я добавил db.set_charset_collation('utf8mb4_uca1400_ai_ci')
, но все равно получаю ту же ошибку. Пробовал db.set_charset_collation('utf8mb4')
тоже. Я посмотрю на MariaDB Connector/Python. Спасибо.
Добавлено также для выбора операторов. SQL_SESSIONS = """ выбрать отдельные TS из времен сопоставления utf8mb4_uca1400_ai_ci; """ Та же ошибка.
Добавлено «сопоставление»: "utf8mb4_uca1400_ai_ci"
в dict Connection, и теперь я получаю DBcm.CredentialsError: Collation 'utf8mb4_uca1400_ai_ci' unknown
. :( Но он указан в show collation
.
Связанный: stackoverflow.com/questions/78859228/… (странное совпадение, что оба были опубликованы примерно в одно и то же время).
Только что попробовал MariaDB Connector/Python, и все работает. @danblack, если ты хочешь опубликовать ответ, я отмечу это как отвеченное.
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.
Настраиваете ли вы свое приложение Python на использование соответствующего значения для сортировки? Возможно, есть какие-то настройки по умолчанию, которые вам нужно изменить или переопределить?