Azure 中的 Django 应用程序 - /edit_profile/ 处的操作错误(1366,"Incorrect string value: '\xC5\x9B' for column 'first_name' at row 1")

Django app in Azure - OperationalError at /edit_profile/ (1366, "Incorrect string value: '\\xC5\\x9B' for column 'first_name' at row 1")

我在 Azure 上托管了 Django 应用程序,该应用程序连接到 MySQL 数据库(用于 MySQL 的 Azure 数据库)。我想编辑我的个人资料,所以我将 ść(用于测试目的)放在名字中,但出现以下错误:

OperationalError at /edit_profile/
(1366, "Incorrect string value: '\xC5\x9B\xC4\x87' for column 'first_name' at row 1")
Request Method: POST
Request URL:    http://127.0.0.1:8000/edit_profile/
Django Version: 3.2
Exception Type: OperationalError
Exception Value:    
(1366, "Incorrect string value: '\xC5\x9B\xC4\x87' for column 'first_name' at row 1")

Traceback Switch to copy-and-paste view
C:\Users\myname\Anaconda3\lib\site-packages\django\db\backends\utils.py, line 84, in _execute
                return self.cursor.execute(sql, params) …
▶ Local vars
C:\Users\myname\Anaconda3\lib\site-packages\django\db\backends\mysql\base.py, line 73, in execute
            return self.cursor.execute(query, args) …
▶ Local vars
C:\Users\myname\Anaconda3\lib\site-packages\MySQLdb\cursors.py, line 206, in execute
        res = self._query(query) …
▶ Local vars
C:\Users\myname\Anaconda3\lib\site-packages\MySQLdb\cursors.py, line 319, in _query
        db.query(q) …
▶ Local vars
C:\Users\myname\Anaconda3\lib\site-packages\MySQLdb\connections.py, line 259, in query
        _mysql.connection.query(self, query) …
▶ Local vars
The above exception ((1366, "Incorrect string value: '\xC5\x9B\xC4\x87' for column 'first_name' at row 1")) was the direct cause of the following exception:
C:\Users\myname\Anaconda3\lib\site-packages\django\core\handlers\exception.py, line 47, in inner

我在 Azure 上的服务器参数是:

character_set_server = utf8mb4(utf8 也不起作用)

collation_server = utf8_general_ci

据我所知,Django 默认使用 utf-8,所以我的问题是如何让用户在他们的用户名、名字和姓氏中使用波兰语、法语、德语等字母?

编辑:

这个问题的解决方法比我想象的简单多了。我检查了所有表中的编码,显然默认编码设置为 latin1_swedish_ci 而不是 uft8mb4。我在我的数据库选项中指定了它:

    'OPTIONS': {
    'charset': 'utf8mb4',
    'init_command': 'SET character_set_connection=utf8mb4;'
                    'SET collation_connection=utf8mb4_unicode_ci;'
                    "SET NAMES 'utf8mb4';"
                    "SET CHARACTER SET utf8mb4;"},

并更改了所有现有表中的编码。

Hex C59B C487 是 ść 的 UTF-8 编码。

连接设置是什么?它们应该是这样的:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        ...
        'OPTIONS': {
                    'charset': 'utf8mb4',
                    'use_unicode': True, },
    },
}
my.cnf:

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

[client]
default-character-set=utf8mb4

utf8mb4(MySQL的说法)和UTF-8(外界的说法)是一样的。它包括世界上 'all' 种语言的编码。其中包括波兰语、法语、德语、汉语、切诺基语、克林贡语等

SHOW CREATE TABLE 还应该说 utf8mb4 用于需要包含 ść 等的列

讨论了很多字符集问题,但我认为不包括这个问题。不过,如果您 运行 遇到其他问题,请查看问答。

如果您使用的是“终端”,请确保它 也在使用 UTF-8。对于 Windows' "cmd",请参阅 chcp 65001