MySQL db中的字符串值不正确

时间:2018-11-20 21:12:15

标签: mysql ubuntu encoding sqlalchemy

我正在Ubuntu 16.04.4上运行webapp。 堆栈如下

Python 3.5.2
MySQL 5.7.22
烧瓶
Flask-SQLAlchemy

该Web应用程序具有管理员可使用xlsx上传一些文本的功能。在Web应用程序中使用openpyxl读取的文件。但是,在保存时会出现类似以下错误:

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

一开始我就能够删除麻烦的字符(例如零宽度的空白)。但是现在我不能再这样了。

在互联网上阅读一些信息,我认为这可能是我的数据库未使用utf8mb4。有人可以引导我更新我的数据库及其所有表吗?因为我对SQL和其他东西一无所知。 由于该Webapp用于生产中,因此我不喜欢尝试过时的教程。

1 个答案:

答案 0 :(得分:0)

似乎现在可以工作。我做了以下步骤:

  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. 之类的东西
  8. 我使用以下命令更改数据库设置: ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 然后每个表格如下:

    use databasename;
    ALTER TABLE assessments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
    1. 再次查看表设置,发现latin1_swedish_ci现在已更改为utf8mb4_unicode_ci
    2. 然后,我将sqlalchemy连接url更改为在末尾使用?encoding=utf8mb4
    3. 再次重新启动mysql和webapp。从那时起,它一直在正常工作。