如何解决在 Django 中保存 unicode 字符串时出现 MySQL“不正确的字符串值”错误
我只是想出了一种避免上述错误的方法。
user.first_name = u'Rytis'.encode('unicode_escape')
user.last_name = u'Slatkevi膷ius'.encode('unicode_escape')
user.save()
>>> SUCCEED
print user.last_name
>>> Slatkevi\u010dius
print user.last_name.decode('unicode_escape')
>>> Slatkevi膷ius
这是将此类字符串保存到 MySQL 表中并在渲染到模板进行显示之前对其进行解码的唯一方法吗?
解决方法
尝试将 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 中有 4 个字节的 maxlen 但在 MySQL 中有 3 个字节导致上述错误?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。