Python&MySQL操做过程当中遇到的编码问题

对于Python字符编码的理解 以前整理了一部分,此次主要是设计到数据库操做的。html

下面是一些编码方面的概念和原理,以条目方式整理:mysql

  1.  CREATE DATABASE IF NOT EXISTS db_name DEFAULT CHARSET utf8 COLLATE utf8_general_ci;sql

    1. DEFAULT CHARSET是设置默认字符编码集,也就是数据在库内从存储编码,个人理解是在存储这个层面上的,若是SQL命令是以gbk方式传输数据的(cur.execute('SET NAMES utf8;')),那么存储时用utf8,则查询时看到的会是乱码;数据库

    2. COLLATE utf8_general_ci;是指定校对规则,而校对规则是在字符集内用于比较字符的一套规则。通俗一点,个人理解是数据库以此用于字符数据之间的比对,注意是字符;也就是说“a B c D”这四个字母怎么样区分彼此,或者在数据库表内进行排序:若是设定为“utf8_general_ci”,则按照普通的字母顺序,并且不区分大小写(a B c D)若是设定为“utf8_bin”,则按照二进制排序(B D a c)。服务器

    3. 关于编码和校对规则更深刻的理解,请参看MySQL官网:服务器字符集和校对编码

  2. cur.execute('SET NAMES utf8;')spa

    1. 刚才讲了,DEFAULT CHARSET x是设置数据库中数据在存放时须要采用的编码,那在命令和数据到达数据库服务器以前,还存在一个链接的过程,这个链接过程采用的编码若是不合适,则会致使在数据库服务器端处理这些命令和数据时采用错误的编码致使乱码。如下是官方解释,有两个语句影响链接字符集:.net

      1. SET NAMES 'charset_name'设计

      2. SET CHARACTER SET charset_namecode

    2. SET NAMES显示客户端发送的SQL语句中使用什么字符集。所以,SET NAMES 'cp1251'语句告诉服务器“未来从这个客户端传来的信息采用字符集cp1251”。它还为服务器发送回客户端的结果指定了字符集。SET NAMES 'x'语句与这三个语句等价:

      1. mysql> SET character_set_client = x;

      2. mysql> SET character_set_results = x;

      3. mysql> SET character_set_connection = x;

    3. SET CHARACTER SET语句是相似的,可是为 默认数据库设置链接字符集和校对规则。SET CHARACTER SET x语句与这三个语句等价,当一个客户端链接时,它向服务器发送但愿使用的字符集名称:

      1. mysql> SET character_set_client = x;

      2. mysql> SET character_set_results = x;

      3. mysql> SET collation_connection = @@collation_database;

    4. 更详细的固然也得看官方:链接字符集和校对

  3. Unicode只是一个符号集,它规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储,Unicode码能够采用UCS-2格式直接存储,而UTF-8则是在互联网上使用最广的一种unicode的实现方式。

  4. 困,待续。

相关文章
相关标签/搜索