当前位置: 首页 > 面试题库 >

在Django中保存Unicode字符串时,MySQL“字符串值不正确”错误

胡厉刚
2023-03-14
问题内容

尝试将first_name,last_name保存到Django的auth_user模型时,出现奇怪的错误消息。

失败的例子

user = User.object.create_user(username, email, password)
user.first_name = u'Rytis'
user.last_name = u'Slatkevičius'
user.save()
>>> Incorrect string value: '\xC4\x8Dius' for column 'last_name' at row 104

user.first_name = u'Валерий'
user.last_name = u'Богданов'
user.save()
>>> Incorrect string value: '\xD0\x92\xD0\xB0\xD0\xBB...' for column 'first_name' at row 104

user.first_name = u'Krzysztof'
user.last_name = u'Szukiełojć'
user.save()
>>> Incorrect string value: '\xC5\x82oj\xC4\x87' for column 'last_name' at row 104

成功的例子

user.first_name = u'Marcin'
user.last_name = u'Król'
user.save()
>>> SUCCEED

MySQL设置

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       | 
| character_set_connection | utf8                       | 
| character_set_database   | utf8                       | 
| character_set_filesystem | binary                     | 
| character_set_results    | utf8                       | 
| character_set_server     | utf8                       | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

表字符集和排序规则

表auth_user具有utf-8字符集,并带有utf8_general_ci排序规则。

UPDATE命令的结果

使用UPDATE命令将上述值更新到auth_user表时,它没有引发任何错误。

mysql> update auth_user set last_name='Slatkevičiusa' where id=1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select last_name from auth_user where id=100;
+---------------+
| last_name     |
+---------------+
| Slatkevi?iusa | 
+---------------+
1 row in set (0.00 sec)

PostgreSQL的

当我在Django中切换数据库后端时,上面列出的失败值可以更新到PostgreSQL表中。真奇怪。

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
...
| utf8     | UTF-8 Unicode               | utf8_general_ci     |      3 | 
...

但是从http://www.postgresql.org/docs/8.1/interactive/multibyte.html,我发现了以下内容:

Name Bytes/Char
UTF8 1-4

这是否意味着unicode char在PostgreSQL中的maxlen为4个字节,而在MySQL中为3个字节,这导致了上述错误?


问题答案:

我遇到了同样的问题,并通过更改列的字符集解决了它。即使你的数据库具有默认字符集,utf-8我认为数据库列在MySQL中也可能具有不同的字符集。这是我使用的SQL查询:

    ALTER TABLE database.table MODIFY COLUMN col VARCHAR(255)
    CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;


 类似资料:
  • 我有一个在生产模式下运行的rails应用程序,但是今天当一个用户试图保存记录时突然出现了这个错误。 谢谢

  • 我试图上传csv到我的mysql数据库使用jooq,但我得到以下错误。我在网上尝试了各种建议的解决方案,但都没能解决 我如何将csv上传到jooq 我确保文件在utf-8中,但是当有UTF-8字符记录时,无法保存在DB中并抛出上述错误。我确保使用 前端ajax: 我正在通过java rest从前端读取文件 并在传递给jooq之前在本地系统中递归写入文件 我将DB设置为接受utf-8,并进行了验证

  • 问题内容: 这个问题看起来很尴尬,但我一直找不到答案。 与下面的C#代码行等效的PHP是什么? 此示例创建一个带有单个Unicode字符的字符串,该字符串的“ Unicode数值”为十六进制的1000(十进制的4096)。 也就是说,在PHP中,如何创建一个具有“ Unicode数值”已知的Unicode字符的字符串? 问题答案: 因为JSON直接支持语法,所以我想到的第一件事是: 另一种选择是使

  • 问题内容: 您能否详细说明Python中字节字符串和Unicode字符串之间的区别。我读过这个: 字节码只是将源代码转换为字节数组 这是否意味着Python具有自己的编码/编码格式?还是使用操作系统设置?我不明白 你能解释一下吗?谢谢! 问题答案: 没有python不使用自己的编码。它将使用它有权访问并指定的任何编码。中的字符代表一个unicode字符。但是,要表示256个以上的字符,单个unic

  • 问题内容: 我需要一条SQL更新语句来更新所有行的特定字段,并在现有值的前面添加一个字符串“ test”。 例如,如果现有值为“ try”,则应变为“ testtry”。 问题答案: 您可以使用CONCAT函数来执行此操作: 如果您想更聪明地只更新尚未预先测试的列,请尝试

  • 我有一个输入表单,允许某人键入unicode字符。所以它可能是类似于“嘿,uF32A怎么了?如果我得到这个字符串,它将有一个子字符串“\uF32A”,我如何将其转换为字符“\uF32A”?