Неверное строковое значение в базе данных MySQL - PullRequest
0 голосов
/ 21 ноября 2018

Я запускаю веб-приложение на Ubuntu 16.04.4.Стек выглядит следующим образом:

Python 3.5.2
MySQL 5.7.22
Flask
Flask-SQLAlchemy

В веб-приложении есть функция, позволяющая администраторам загружать текст с помощьюxlsx.файл, который читается с openpyxl внутри веб-приложения.Однако при сохранении я получаю ошибки вроде:

sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (1366, "Incorrect string value: '\\xC4\\x9B nep...' 

Вначале я смог удалить символы, которые создавали проблемы (например, пробел нулевой ширины).Но теперь я больше не могу этого делать.

Читая немного в интернете, я думаю, возможно, мой БД не использует utf8mb4.Может ли кто-нибудь привести меня к обновлению моей базы данных и всех ее таблиц?Потому что я ничего не знаю о SQL и прочем.Поскольку веб-приложение используется в производстве, я не люблю пробовать учебники, которые устарели.

1 Ответ

0 голосов
/ 21 ноября 2018

Кажется, сейчас работает.Я сделал следующие шаги:

  1. Запустил mysql cli с: mysql -u root -p
  2. Авторизовался с помощью root pw.
  3. Проверял параметры по умолчанию, используяshow variables like "%character%";, который дал мне:

    +--------------------------+----------------------------+
    | 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/ |
    +--------------------------+----------------------------+
    

    и show variables like "%collation%";, который дал мне

    +----------------------+-------------------+
    | Variable_name        | Value             |
    +----------------------+-------------------+
    | collation_connection | utf8_general_ci   |
    | collation_database   | latin1_swedish_ci |
    | collation_server     | latin1_swedish_ci |
    +----------------------+-------------------+
    
  4. Поэтому я отредактировал /etc/mysql/my.cnf Я добавил:

    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    
  5. Перезапуск mysql (sudo service mysql restart) и выполнение тех же команд, что и выше, теперь дали мне

    +--------------------------+----------------------------+
    | 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/ |
    +--------------------------+----------------------------+
    

    и

    +----------------------+--------------------+
    | Variable_name        | Value              |
    +----------------------+--------------------+
    | collation_connection | utf8mb4_general_ci |
    | collation_database   | utf8mb4_unicode_ci |
    | collation_server     | utf8mb4_unicode_ci |
    +----------------------+--------------------+
    
  6. Итак, я посмотрел настройки таблицы, используя SHOW TABLE STATUS FROM databasename; Они все еще использовали такие вещи, как latin1_swedish_ci

  7. Я использовал следующее, чтобы изменить настройки базы данных: ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; и следующее длякаждый стол:

    use databasename;
    ALTER TABLE assessments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  8. Повторный поиск настроек таблицы показал, что latin1_swedish_ci теперь было изменено на utf8mb4_unicode_ci
  9. Затем я изменил URL-адрес подключения sqlalchemy, чтобы в конце использовать ?encoding=utf8mb4.
  10. ПерезапущенСнова MySQL и веб-приложение.С тех пор он работает нормально.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...