首页 > 代码库 > Python&MySQL操作过程中遇到的编码问题

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

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

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

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

    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;‘)

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

      1. SET NAMES ‘charset_name‘

      2. SET CHARACTER SET charset_name

    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. 困,待续。