转帖:django下操作数据库的字符问题

来源:互联网 发布:js触发a href跳转 编辑:程序博客网 时间:2024/05/21 18:49
 

Django 使用MYSQL数据库 Latin1

分类: python 365人阅读 评论(0)收藏 举报

      公司mysql统一用latin1的编码,真是叫人苦不堪言。Django用默认UTF8访问MYSQL数据库。在操作数据库时,不管你怎么转码,最终写到数据库里的中文都是乱码。在网上找了很久,也没解决这个问题。

 

      后来看了一个DJANGO的MYSQL操作的源码,发现了一些问题 先是/django/db/backends/mysql/base.py 文件的 257 到263行

    

view plaincopy to clipboardprint?
  1. def _cursor(self):  
  2.     if not self._valid_connection():  
  3.        kwargs = {  
  4.             'conv': django_conversions,  
  5.             'charset''utf8',  
  6.             'use_unicode'True,  
  7.         }  

 

 

关键在这两行2def _cursor(self):
261                 'charset': 'utf8',
262                 'use_unicode': True,

 

这说明,操作数据库用的是通用编码utf8 而且是硬编码进去的。如果我也硬编码改这里的话,以后有UTF8的库的话,就糟糕了。所以要想办法将这两项写到配置文件里。所以选注释掉这两行。在settings_dict = self.settings_dict 这行下面添加如下的代码

 

view plaincopy to clipboardprint?
  1. if settings_dict['USE_UNICODE']:  
  2.                  kwargs['use_unicode'] = settings_dict['USE_UNICODE']  
  3.              else:  
  4.                  kwargs['use_unicode'] = True  
  5.              if settings_dict['DATABASE_CHARSET']:  
  6.                  kwargs['charset'] = settings_dict['DATABASE_CHARSET']  

 

修改settings.py 加入如下两行

view plaincopy to clipboardprint?
  1. TEST_DATABASE_CHARSET = 'latin1'  
  2. USE_UNICODE = False  

 

但这样改了之后,会找不到DATABASE_CHARSET和USE_UNICODE 这说明在配置转进来之前做了筛选,再继续看这个文件/django/db/__init__.py 会看到这样的代码

 

view plaincopy to clipboardprint?
  1. connection = backend.DatabaseWrapper({  
  2.       'DATABASE_HOST': settings.DATABASE_HOST,  
  3.       'DATABASE_NAME': settings.DATABASE_NAME,  
  4.       'DATABASE_OPTIONS': settings.DATABASE_OPTIONS,  
  5.       'DATABASE_PASSWORD': settings.DATABASE_PASSWORD,  
  6.       'DATABASE_PORT': settings.DATABASE_PORT,  
  7.       'DATABASE_USER': settings.DATABASE_USER,  
  8.       'TIME_ZONE': settings.TIME_ZONE,  
  9. })  

 

看得出来,这行是在初始化数据库对象,把settings.py里的一些设置传了进去。那么,我们在这里把刚刚添加的两个设置放进来就行了

'DATABASE_CHARSET':settings.DATABASE_CHARSET,
'USE_UNICODE':settings.USE_UNICODE,

 

保存,重启下APACHE 。再运行原来的程序,成功向数据库中写入数据,中文不再是编码。

但是,这个也不能说是完全解决,在操作数据库时,会报一些异常 UnicodeDecodeError、UnicodeEncodeError和DjangoUnicodeDecodeError 把它们抓住后忽略掉就行了

原创粉丝点击