Django 使用MYSQL数据库 Latin1
2010-02-23 10:57
666 查看
公司mysql统一用latin1的编码,真是叫人苦不堪言。Django用默认UTF8访问MYSQL数据库。在操作数据库时,不管你怎么转码,最终写到数据库里的中文都是乱码。在网上找了很久,也没解决这个问题。
后来看了一个DJANGO的MYSQL操作的源码,发现了一些问题 先是/django/db/backends/mysql/base.py 文件的 257 到263行
关键在这两行2def _cursor(self):
261 'charset': 'utf8',
262 'use_unicode': True,
这说明,操作数据库用的是通用编码utf8 而且是硬编码进去的。如果我也硬编码改这里的话,以后有UTF8的库的话,就糟糕了。所以要想办法将这两项写到配置文件里。所以选注释掉这两行。在settings_dict = self.settings_dict 这行下面添加如下的代码
修改settings.py 加入如下两行
但这样改了之后,会找不到DATABASE_CHARSET和USE_UNICODE 这说明在配置转进来之前做了筛选,再继续看这个文件/django/db/__init__.py 会看到这样的代码
看得出来,这行是在初始化数据库对象,把settings.py里的一些设置传了进去。那么,我们在这里把刚刚添加的两个设置放进来就行了
'DATABASE_CHARSET':settings.DATABASE_CHARSET,
'USE_UNICODE':settings.USE_UNICODE,
保存,重启下APACHE 。再运行原来的程序,成功向数据库中写入数据,中文不再是编码。
但是,这个也不能说是完全解决,在操作数据库时,会报一些异常 UnicodeDecodeError、UnicodeEncodeError和DjangoUnicodeDecodeError 把它们抓住后忽略掉就行了
后来看了一个DJANGO的MYSQL操作的源码,发现了一些问题 先是/django/db/backends/mysql/base.py 文件的 257 到263行
] def _cursor(self): if not self._valid_connection(): kwargs = { 'conv': django_conversions, 'charset': 'utf8', 'use_unicode': True, }
关键在这两行2def _cursor(self):
261 'charset': 'utf8',
262 'use_unicode': True,
这说明,操作数据库用的是通用编码utf8 而且是硬编码进去的。如果我也硬编码改这里的话,以后有UTF8的库的话,就糟糕了。所以要想办法将这两项写到配置文件里。所以选注释掉这两行。在settings_dict = self.settings_dict 这行下面添加如下的代码
if settings_dict['USE_UNICODE']: kwargs['use_unicode'] = settings_dict['USE_UNICODE'] else: kwargs['use_unicode'] = True if settings_dict['DATABASE_CHARSET']: kwargs['charset'] = settings_dict['DATABASE_CHARSET']
修改settings.py 加入如下两行
TEST_DATABASE_CHARSET = 'latin1' USE_UNICODE = False
但这样改了之后,会找不到DATABASE_CHARSET和USE_UNICODE 这说明在配置转进来之前做了筛选,再继续看这个文件/django/db/__init__.py 会看到这样的代码
]connection = backend.DatabaseWrapper({ 'DATABASE_HOST': settings.DATABASE_HOST, 'DATABASE_NAME': settings.DATABASE_NAME, 'DATABASE_OPTIONS': settings.DATABASE_OPTIONS, 'DATABASE_PASSWORD': settings.DATABASE_PASSWORD, 'DATABASE_PORT': settings.DATABASE_PORT, 'DATABASE_USER': settings.DATABASE_USER, 'TIME_ZONE': settings.TIME_ZONE, })
看得出来,这行是在初始化数据库对象,把settings.py里的一些设置传了进去。那么,我们在这里把刚刚添加的两个设置放进来就行了
'DATABASE_CHARSET':settings.DATABASE_CHARSET,
'USE_UNICODE':settings.USE_UNICODE,
保存,重启下APACHE 。再运行原来的程序,成功向数据库中写入数据,中文不再是编码。
但是,这个也不能说是完全解决,在操作数据库时,会报一些异常 UnicodeDecodeError、UnicodeEncodeError和DjangoUnicodeDecodeError 把它们抓住后忽略掉就行了
相关文章推荐
- 如何在python3环境下的Django中使用MySQL数据库
- Django使用inspectdb连接现有的mysql数据库遇到的问题
- Django1.7+python 2.78+pycharm使用mysql数据库
- 基于Python3.6使用Django框架连接mysql数据库的驱动模块安装解决办法
- python——django使用mysql数据库(二)
- Pyhton_Django学习笔记(五) 模型与MYSQL数据库使用
- python——django使用mysql数据库(二)
- python Django 学习笔记(四)—— 使用MySQL数据库
- Django学习笔记(三)Django使用admin管理界面来操作mysql数据库
- Django学习6-mysql数据库使用1-安装与连接
- Django使用mysql数据库
- 在python3环境下的Django中使用MySQL数据库的实例
- Django使用Mysql数据库已经存在的数据表方法
- django1.10 mysql数据库使用
- django与python3使用MySQL数据库
- Django使用Mysql数据库已经存在的数据表
- django操作mysql数据库&models的使用
- django 使用mysql数据库
- django1.8使用mysql数据库
- Django1.96使用mysql数据库