python mysql 编码方式,Python3编码与mysql编码介绍
Python3自诩解决了编码问题,但还是有一系列的坑。本文就记录下前几天遇到的python3编码问题。mysql编码问题附带介绍。
python3 json串的编码
针对于包含中文的字典,如果想要正常显示中文,在dumps时,需配置参数ensure_ascii=False。举例:
a={"name":"中国"}
json.dumps(a)
'{"name": "\\u4e2d\\u56fd"}'
json.dumps(a,ensure_ascii=False)
'{"name": "中国"}'
针对于包含特定转义字符的字符串,如果想要正常解析,需要在loads时配置strict=False。举例:
json.loads('{"foo":"bar\nbaz"}')
Traceback (most recent call last):
File "", line 1, in
json.loads('{"foo":"bar\nbaz"}')
File "C:\Users\jonyguo\AppData\Local\Programs\Python\Python36\lib\json\__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "C:\Users\jonyguo\AppData\Local\Programs\Python\Python36\lib\json\decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Users\jonyguo\AppData\Local\Programs\Python\Python36\lib\json\decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Invalid control character at: line 1 column 12 (char 11)
json.loads('{"foo":"bar\nbaz"}', strict=False)
{'foo': 'bar\nbaz'}
python3的字符串编码
python3中只有两种字符串,一是str,一是bytes。str经过encode变成bytes,bytes经过decode变成str。
有时从网络取出的包含中文的数据为unicode编码的字符串,可通过先编码在解码转化为中文:
a="\\u4e2d\\u56fd"
print(a)
\u4e2d\u56fd
a.encode().decode("unicode_escape")
'中国'
也可以通过repr将其转化为字符串,将两个反斜杠替换为一个反斜杠来解决这个问题:
a="\\u4e2d\\u56fd"
eval(repr(a).replace('\\\\', '\\'))
'中国'
python3 + apache的字符编码问题
python3脚本作为cgi供前端界面调用。遇到了一个很奇怪的问题,我通过编写的python脚本调用cgi时,编码一切正常,但是当我通过http调用时会出现一些问题。从数据库中取中文数据,返回前端显示一切都正常。但是当我把数据库中的中文与一些字符组成一个文件名,判断文件是否存在时,一直报错:UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-49: ordinal not in range(128)。
刚开始以为是apache的编码问题,后来查看apache的编码也确定是utf8,不知所措。经google,查找到了原因。
https://www.raspberrypi.org/forums/viewtopic.php?t=65257 这个帖子里面有介绍到说:
The difference is that from the command line Python inherits your locale settings (probably LANG=fr_FR.UTF-8), whereas from Apache it inherits LANG=C. It knows that your strings are Unicode, but it can not print them in an ASCII environment.
说是通过python脚本调用的时候python继承的是locale 设置,为utf8,可正常显示(个人感觉这里可能说的有些不恰当,这里应该是采用python3自己的编码)。而apache继承的是LANG=C,为ascii,无法正常显示。按照其配置,在/etc/apache2/envvars中添加. /etc/default/locale(/etc/sysconfig/i18n)即可。配置后发现依然无法解决问题。
后又继续google,找到了解决方案。
https://stackoverflow.com/questions/9322410/set-encoding-in-python-3-cgi-scripts
Add PassEnv LANG line to the end of your /etc/apache2/apache2.conf or .htaccess.
Uncomment . /etc/default/locale line in /etc/apache2/envvars.
Make sure line similar to LANG="en_US.UTF-8" is present in /etc/default/locale.
就是在apache2的配置文件中添加一行:PassEnv LANG 即可。要确保LANG为utf8。
mysql编码问题
查看当前的数据库编码:
mysql> show variables like 'character%';
+--------------------------+--------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.1.46-linux-x86_64-glibc23/share/charsets/ |
+--------------------------+--------------------------------------------------------------+
从上图可知,数据库的编码为utf8.
● character_set_client:无论客户端传递的是什么编码的数据,服务器都当成该编码来处理,例如该编码为UTF8,那么如果客户端发送过来的数据不是UTF8,那么就会出现乱码;
● character_set_connection:通过该编码与client一致!该编码不会导致乱码!当执行的是查询语句时,客户端发送过来的数据会先转换成connection指定的编码。但只要客户端发送过来的数据与client指定的编码一致,那么转换就不会出现问题;
● character_set_database:数据库默认编码,在创建数据库时,如果没有指定编码,那么默认使用database编码;
● character_set_filesystem:可以理解为文件的最终存储形式,是二进制形式的;
● character_set_server:MySQL服务器默认编码;
● character_set_results:MySQL会把数据转换成该编码后,再发送给客户端,例如该编码为UTF8,那么如果客户端不使用UTF8来解读,那么就会出现乱码,说明客户端必须使用result指定的编码来解码;
一条数据库连接的过程如下:
client --> connection --> server --> connection --> result
其实只要保证client、connection和result 一致就不会出现乱码问题。
通过set names utf8 保证client、connection和result 的编码一致:
mysql> show variables like 'character%';
+--------------------------+--------------------------------------------------------------+
| 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 | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql-5.1.46-linux-x86_64-glibc23/share/charsets/ |
+--------------------------+--------------------------------------------------------------+
python mysql 编码方式,Python3编码与mysql编码介绍相关推荐
- mysql二进制方式_MySQL数据库之MySql二进制连接方式详解
本文主要向大家介绍了MySQL数据库之MySql二进制连接方式详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 使用mysql二进制方式连接 您可以使用MySQL二进制方式进 ...
- 修改mysql编码方式centos_CentOS下修改mysql数据库编码为UTF-8(附mysql开启远程链接和开放3306端口)...
楼主在配置好linux云服务器的jdk,tomcat,mysql后,当要开始部署项目是,忽然意识到一个很严重的问题,那就是数据库的编码问题,自安装完成后并未修改数据库的额编码....下面就来讲说lin ...
- pycharm与python连接_pycharm2017实现python3.6与mysql的连接
本文为大家分享了pycharm2017上实现python3.6与mysql的连接方法,供大家参考,具体内容如下 与其他的IDE不同,pycharm不需要额外下载mydqldb包等,pycharm里可以 ...
- v74.01 鸿蒙内核源码分析(编码方式篇) | 机器指令是如何编码的 | 百篇博客分析OpenHarmony源码
Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https ...
- linux下安装mysql的方式_linux下安装mysql的两种方式
linux下安装mysql的两种方式 1 源码安装 1 创建mysql用户: useradd mysql passwd mysql 2 解压缩下载的mysql包: tar -zxvf mysql-5. ...
- [python运维] 使用python3制作一个mysql压测小工具!
0x01 argparse模块 argparse是Python 标准库中推荐的命令行解析模块,他可以实现给出参数提示和接收用户输入的参数,类似linux的命令行功能: [root@yun ...
- java ascii 编码方式_JAVA 的ASCII字符编码一览表
JAVA 的ASCII字符编码一览表 二进制 十进制 十六进制 缩写 可以显示的表示法 名称/意义 0000 0000 0 00 NUL ␀ 空字符(Null) 0000 0001 1 01 SOH ...
- MySQL查看与修改编码方式(mysql、数据库、表)
mysql默认的编码方式是latin1,通过以下命令查看 show variables like 'char%'; 或者: show variables like 'character%'; mysq ...
- python中的编码方式
说明 这里我们以python2.7为例讲解python的编码方式 指定执行编码方式 python2.7的默认编码方式为ascii字符集,这里所说的编码方式指执行编码方式,在编程过程中,有三个地方都涉及 ...
最新文章
- C内存2:程序是如何运行的
- WCF与ASP.NET Core性能比较
- 初步了解学习将传统单机应用改造成Dubbo服务的过程
- RRT,RRT*,A*,Dijkstra,PRM算法
- u盘数据恢复的原理_日臻薄技 | 电脑回收站数据恢复的三个方法
- ImageJ Nikon_科研人必备图像处理软件—ImageJ软件分享
- Opencv 图片缩小尺寸原理
- 解压deb_Linux填坑记:很全面的解压和压缩命令集合
- 简单介绍一下vue2.0
- Oracle的三种高可用集群方案
- Atitit SpringCache缓存使用 艾提拉 attilax总结 1. Spring的抽象已经做得够好了,适合于大多数场景,非常复杂的就需要自己AOP实现了。	1 1.1. 设置配置文件支持
- 多格式无水印录屏软件
- 什么是网络分析仪?它的重要技术指标有哪些?
- 常见软件非功能性需求描述案例
- golang 获取本周 上周的时间
- linux 端口不通,linux的端口不通怎么解决
- java and android_java jvm和android DVM区别
- vscode 下载地址
- 一款基于企业微信的固定资产管理软件
- 【运筹学】线性规划 图解法 ( 唯一最优解 | 无穷最优解 | 无界解 | 无可行解 )
热门文章
- 003_FastDFS分布式横向扩容和纵向添加storage
- mq 接口 java_Rabbitmq Java Client Api详解
- mflac文件解析工具_9 个爱不释手的 JSON 工具
- Java数据结构和算法:234树和外部存储
- android游戏加载,Android 游戏引擎libgdx 资源加载进度百分比显示案例分析
- ad域帐号登录提示无法处理请求_面试官:说一下单点登录的几种实现方式
- c99变长数组_你学过数组,那你知道柔性数组吗?
- linux 爬虫工具,技术|如何在Ubuntu 14.04 LTS安装网络爬虫工具:Scrapy
- java8 虚拟机调优_Java虚拟机调优(八)-典型配置举例2
- html5下拉列表默认值,element-ui中的select下拉列表设置默认值方法_简单_前端开发者...