mysql db中的字符串值不正确

oxcyiej7  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(402)

我正在ubuntu16.04.4上运行一个webapp。堆栈如下
python 3.5.2版
MySQL5.7.22版本

flask 炼金术
webapp有一个特性,管理员可以使用xlsx上传一些文本。在webapp中使用openpyxl读取的文件。但是,在保存时,会出现如下错误:

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

一开始,我可以删除那些制造麻烦的字符(例如零宽度的空白)。但现在我不能再这样做了。
读了一点在互联网上,我想可能是我的数据库没有使用utf8mb4。有人能让我更新数据库和它的所有表吗?因为我对sql之类的东西一无所知。由于webapp是在生产中使用的,我不喜欢尝试过时的教程。

zlwx9yxi

zlwx9yxi1#

似乎现在起作用了。我做了以下步骤:
启动mysql cli时使用: mysql -u root -p 使用根pw登录。
使用检查默认参数 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 |
+----------------------+-------------------+

所以我编辑了 /etc/mysql/my.cnf 我补充说:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

重新启动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 |
+----------------------+--------------------+

所以我用 SHOW TABLE STATUS FROM databasename; 他们仍然使用类似 latin1_swedish_ci 我使用以下方法更改数据库设置: ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 各表如下:

use databasename;
ALTER TABLE assessments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

再查一下表格的设置就知道 latin1_swedish_ci 现在改为 utf8mb4_unicode_ci 然后我将sqlalchemy连接url改为 ?encoding=utf8mb4 最后。
重新启动mysql和webapp。从那以后它就正常工作了。

相关问题