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

相關文章
相關標籤/搜索