Django 使用MYSQL数据库 Latin1

分类: python 2010-02-23 10:57 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. }

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 这行下面添加如下的代码

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']

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 加入如下两行

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

TEST_DATABASE_CHARSET = 'latin1' 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. })

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 把它们抓住后忽略掉就行了

转帖:django下操作数据库的字符问题相关推荐

  1. DJANGO中操作数据库

    Django 数据库 API 参考 原文地址:http://www.woodpecker.org.cn/obp/django /django-faq/db-api.html 作者: Django 团队 ...

  2. 记录Python使用Django框架操作数据库遇到的问题与流程

    ** python学习使用Django框架连接mysql数据库的步骤和遇到的一些问题 ** 配置数据库: 项目的settings.py文件的77行修改如下: DATABASES = {'default ...

  3. PHP中的MYSQL常用函数(php下操作数据库必备)

    2019独角兽企业重金招聘Python工程师标准>>> 1.mysql_connect()-建立数据库连接 格式: resource mysql_connect([string ho ...

  4. Django中models模型(操作数据库)

    ORM 自己创建数据库 连接数据库 Django操作表 数据库操作 新建 删除 获取数据 实例:用户管理 Django开发操作数据库更简单,内部提供了ORM框架 ORM的流程 ORM ORM,全称 O ...

  5. django配置mysql数据库

    查看ubuntu已安装的所有软件: dpkg -l dpkg -l | grep mysql 查看软件安装的路径 dpkg -L | grep mysql 查看开机启动的软件,需要额外安装插件: su ...

  6. django进阶06数据库事务

    原创:django进阶06数据库事务 锁 1.1:乐观锁: 概念:同一条数据很少会因为并发修改而产生冲突,适用于读多写少的场景. 实现方式:读取一个字段,执行处理逻辑,当需要更新数据时,再次检查该字段 ...

  7. 测试操作数据库mysql数据库吗_软件测试-MySQL(六:数据库函数)

    一.MySQL函数 1.数学函数 PI()  #返回pi的值(圆周率)默认显示小数位数是6位 FLOOR(x) 返回小于x的最大整数(去掉小数取整) CEILING(x)进一取整 ROUND(x,y) ...

  8. Django操作数据库

    文章目录 Django操作数据库 Django访问流程 空项目结构 ASGI和WSGI区别 HelloWord views和url配置 目录 讲解 效果 模板 模板应用实例 目录结构 新建html文件 ...

  9. Python Web开发框架之Django篇——二、Django连接MySQL数据库以及建表的操作

    二.Django连接MySQL数据库以及建表的操作 准备工作:安装Python访问MySQL的模块 一.修改project同名目录下面的__init__.py文件 二.修改project同名目录下面的 ...

最新文章

  1. 机器学习数据预处理之缺失值:众数(mode)填充
  2. 漂洋过海来看你 可惜Uber不便宜
  3. Springboot-data-jpa
  4. Bitcoin比特币与BlockChain区块链技术
  5. mysql注入漏洞语句,web安全之sql注入漏洞
  6. Effective C++ 条款03:尽可能使用const
  7. java breakpoint_java断点
  8. 10无法勾选隐藏的项目_Excel的隐藏和保护,你会用吗?
  9. python3中input输入浅谈_详解Python3中的 input() 函数
  10. Project Pacific的第一次接触(转)
  11. xhtml css 漏 整理
  12. Percona PT-kill重构版(PHP)
  13. 《刺杀骑士团长》读后感
  14. 顺序表实验——顺序表的基本操作
  15. opencv 摄像机标定
  16. 解决ubuntu12.04 virtubox xp 有道词典发音问题
  17. python调用gpu amd_TensorFlow使用AMD GPU实现加速(ROCm/Ubuntu 18.04)
  18. 3ds Max随堂笔记 材质和贴图
  19. xshell下载安装
  20. 云课堂缺勤补签软件_GO柱状图绘图指南 | 云课堂(22)

热门文章

  1. 不要轻易在数据库(尤其是线上数据库)执行,update、delete数据 !!!
  2. Android 模块化编程之引用本地的aar
  3. Python数据分析(一):Pandas、Numpy
  4. 在线数据分析4大常用功能
  5. 可视化设计的时候应该注意什么
  6. 大数据分析应注意哪些问题
  7. 垃圾分类急上头?物联网卡来消愁
  8. python密码编程_Python密码学编程
  9. oracle用户sde老是锁定,关于ArcGIS10.0版本的SDE密码修改,账户锁定,SDE服务启动又停止等问题的解决...
  10. ubuntu虚拟机进程被杀死_vmware虚拟机奔溃,如何抢救文件