我正在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用于生产中,因此我不喜欢尝试过时的教程。
答案 0 :(得分:0)
似乎现在可以工作。我做了以下步骤:
mysql -u root -p
使用以下命令检查了默认参数
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
?encoding=utf8mb4
。