python – Django:Unicode,MySQL和编码(latin1,koi8-r)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – Django:Unicode,MySQL和编码(latin1,koi8-r),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2873字,纯文字阅读大概需要5分钟。
内容图文
![python – Django:Unicode,MySQL和编码(latin1,koi8-r)](/upload/InfoBanner/zyjiaocheng/903/1fbd3b46133e400186f6a555419c2c66.jpg)
Django 2.0版. Python 3
我的数据库charset和collat??ion:
mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| latin1 | latin1_swedish_ci |
+--------------------------+----------------------+
老开发人员使用Perl在KOI8-R编码中插入数据:(
为了从数据库中获取正确的值,我使用了丑陋的构造str(用户名).encode(‘latin1’).decode(‘koi8-r’).什么?我需要在我的所有项目中使用它来将数据发送到输出?或编写函数来编码上下文字典,但我还需要额外的编码/解码所有数据.它会影响可用性和生产力
如果没有这个,我会得到一些类似于ÏÏÏ……………………………………………………………………………………………….
如何在Django中全局设置编码以防止在每个地方进行编码/解码操作?我改变了编码方式,没有任何反应.
在settings.py中,我尝试将DEFAULT_CHARSET设置为不同的编码(如果我将default_charset设置为KOI8-R,我会收到错误:UnicodeEncodeError:’charmap’编解码器无法编码位置6228-6235中的字符:字符映射到.使用其他编码没有错误,但没有结果).我尝试在settings.py的数据库部分设置charset和collat??ion的不同值.
'OPTIONS': {
'charset': 'latin1',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES', character_set_client=latin1, character_set_results=latin1, character_set_connection=latin1, collation_connection=latin1_swedish_ci",
}
我添加了< meta http-equiv =“Content-type”content =“text / html; charset = koi8-r(或其他)”/>到< head> index.html模板中的标记.没有结果.
似乎Django每次都执行SET NAMES utf8
为什么在Perl中我可以使用charset = koi8-r发送标头,并且我使用CGI在浏览器中从这些表中获取正常值?为什么在使用Django或Flask的Python中没有类似的结果? Simple example in Perl
解决方法:
我认为你将网络字符编码与存储编码混淆了.在MySQL中,字符串数据的生命大致如下:
disk_storage --decode--> MySQL --encode--> network --decode--> database_driver
从磁盘读取字符串数据时,MySQL使用character_set_database值对其进行解码.
当客户端通过网络连接时,客户端指定连接的编码.对于Python,这通常是UTF-8. MySQL然后将数据编码为连接编码.
然后,Python Mysql驱动程序使用它设置的连接编码对它接收的数据进行解码.
如果这些解码或编码中的任何一个使用了错误的值,那么将会创建错误的数据.如果character_set_database设置不正确,那么MySQL将在对网络连接上的错误数据进行编码之前错误地解码数据.
解决方案应该就像将character_set_database更改为正确的值而不更改实际数据一样简单.
这可以通过以下方式实现:
ALTER DATABASE dbname CHARACTER SET koi8r COLLATE koi8r_general_ci;
(不要运行ALTER TABLE tbl_name CONVERT .. – 这实际上会重新编码您的数据.由于旧的character_set值错误,在编码到新编码之前,您的数据将被错误地解码)
将所有Python设置更改回其默认值(UTF-8等).不要设置DEFAULT_CHARSET或任何其他值.
要确保MySQL驱动程序正确连接并使用UTF-8进行网络连接,请使用use_unicode = True和charset =“utf8”
例如.
>>> db = MySQLdb.connect(host="localhost", user='root', passwd='passwd', db='sandbox', use_unicode=True, charset="utf8")
内容总结
以上是互联网集市为您收集整理的python – Django:Unicode,MySQL和编码(latin1,koi8-r)全部内容,希望文章能够帮你解决python – Django:Unicode,MySQL和编码(latin1,koi8-r)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。