python之MySQL MySQLdb 推薦使用姿勢,解決中文亂碼


0.目錄

2.setup
(1) 安裝步驟,可以順帶安裝mysql administrator和mysql query browser
(2) 安裝完畢,修改 my.ini
(3) 重啟 mysql 服務:
(4) cmd 確認可用:
(5) 安裝 MySQLdb
(6) 腳本內部會先對 execute 的unicode query 參數進行編碼,可以手動加一句 print repr(query) 方便調試,懶得打monkey_patch的話。。。


3.推薦使用姿勢
(1)連接:
(2)創建數據庫:不可省略COLLATE 'utf8_general_ci',有(2)則(3)可以省略 DEFAULT CHARSET=utf8
(3)創建表


4.中文亂碼或其他異常
(1)檢查配置
(2)在Windows cmd 插入或查詢中文出現亂碼
(3)更改數據庫編碼
(4)更改表編碼

1.參考

有關編碼,中文字符的官方解答,必看!!!

A.11 MySQL 5.7 FAQ: MySQL Chinese, Japanese, and Korean Character Sets

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using  EditLine wrapper

Connection id:          21
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.20 MySQL Community Server (GPL)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 4 days 23 hours 32 min 54 sec

Threads: 1  Questions: 186  Slow queries: 0  Opens: 141  Flush tables: 1  Open tables: 130  Queries per second avg: 0.000
--------------

 

2.setup

(1)安裝步驟: Windows 7系統安裝MySQL5.5.21圖解 ,可以順帶安裝mysql administrator和mysql query browser

14、在打開的字符編碼的頁面中,設置mysql要使用的字符編碼,第一個是西文編碼,第二個是多字節的通用utf8編碼,第三個是手動,我們選擇utf-8,如果在這里沒有選擇UTF-8這個編碼的化,在使用JDBC連接數據庫的時候,便會出現亂碼,到那時需要加上如下的代碼“useUnicode=true&characterEncoding=UTF-8 ”,才可以解決亂碼問題,為了以后的方便所以設置為UTF-8編碼,但是有一個問題,那就是當用哪個控制台插入漢字的時候,會報錯,查詢帶漢字的表時,無法顯示漢字,所在需要在每次進入MySQL后,設置一個系統參數“set names  gbk”,即可解決該問題,接下來單擊“next”,繼續配置,如圖所示:

(2) 安裝完畢,修改 my.ini

客戶端cmd打開mysql,執行插入中文報錯或插入中文亂碼解決方案

D:\Program Files\MySQL\MySQL Server 5.5

原來是latin1,修改如下:

# CLIENT SECTION  #will be read by MySQL client applications.
default-character-set=utf8
# SERVER SECTION    #will be used when a new schema or table
character-set-server=utf8

根據下文的 show variables like 'char%'; 顯示:

CLIENT SECTION對應如下三項,可以被連接參數臨時覆蓋 --default-character-set=utf8
character_set_client     | latin1
character_set_connection | latin1
character_set_results    | latin1

SERVER SECTION對應如下二項:
character_set_database   | latin1   
character_set_server     | latin1

(3) 重啟 mysql 服務:

C:\Users\win7>net stop mysql
C:\Users\win7>net start mysql

(4) cmd 確認可用:

mysql -u root -p
回車然后輸入密碼

(5) 安裝 MySQLdb

https://pypi.python.org/pypi/MySQL-python/1.2.5

http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python

(6) 腳本內部會先對 execute 的unicode query 參數進行編碼,可以手動加一句 print repr(query) 方便調試,懶得打monkey_patch的話。。。

C:\Program Files\Anaconda2\Lib\site-packages\MySQLdb\cursors.py

class BaseCursor(object):

    def execute(self, query, args=None):
    
    
        if isinstance(query, unicode):
            query = query.encode(db.unicode_literal.charset)
        if args is not None:
            if isinstance(args, dict):
                query = query % dict((key, db.literal(item))
                                     for key, item in args.iteritems())
            else:
                query = query % tuple([db.literal(item) for item in args])
        print repr(query)  #手動加一句方便調試

 

3.推薦使用姿勢

(1)連接:

Python調用MySQLdb插入中文亂碼的問題

conn = MySQLdb.connect(host='localhost', user='root',passwd='123', db='account', charset='utf8')  # OK

Python使用MySQL數據庫(新)

如果連接數據庫用localhost連接不上,可以換127.0.0.1

 

mysql -h localhost -u root -p  --default-character-set=utf8

import MySQLdb
conn= MySQLdb.connect(
    #host='localhost',    host
='127.0.0.1', port = 3306, user='root', passwd='root', #db ='database_name', charset='utf8' )
curs = conn.cursor()

Mysql中文亂碼問題完美解決方案

(2)創建數據庫:不可省略COLLATE 'utf8_general_ci',有(2)則(3)可以省略 DEFAULT CHARSET=utf8

curs.execute("""
CREATE DATABASE database_name
CHARACTER SET 'utf8'       
COLLATE 'utf8_general_ci'; """)

#確認:
curs.execute('SHOW DATABASES')
curs.fetchall()

(3)創建表

curs.execute('USE database_name')

curs.execute(""" CREATE TABLE table_name( id int not null auto_increment, name char(50) null, cate char(50) null, date datetime null, primary key(id) )engine=InnoDB DEFAULT CHARSET=utf8; """)

#確認:
curs.execute('SHOW TABLES')

4.中文亂碼或其他異常

(1)檢查配置

mysql> show variables like 'char%';
+--------------------------+---------------------------------------------------------+
| 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     | utf8                                                    |
| character_set_system     | utf8                                                    |
| character_sets_dir       | D:\Program Files\MySQL\MySQL Server 5.5\share\charsets\ |
+--------------------------+---------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.5.56, for Win64 (AMD64)

Connection id:          743
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.5.56 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:               3306
Uptime:                 1 day 4 min 47 sec

Threads: 4  Questions: 7373195  Slow queries: 1323  Opens: 4725  Flush tables: 1  Open tables: 0  Qu
eries per second avg: 85.055
--------------

mysql> use temp
Database changed
mysql> show create database temp;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| temp     | CREATE DATABASE `temp` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show full columns from test;
+-------+----------+-----------------+------+-----+---------+----------------+----------------------
-----------+---------+
| Field | Type     | Collation       | Null | Key | Default | Extra          | Privileges
           | Comment |
+-------+----------+-----------------+------+-----+---------+----------------+----------------------
-----------+---------+
| id    | int(11)  | NULL            | NO   | PRI | NULL    | auto_increment | select,insert,update,
references |         |
| name  | char(50) | utf8_general_ci | YES  |     | NULL    |                | select,insert,update,
references |         |
| cate  | char(50) | utf8_general_ci | YES  |     | NULL    |                | select,insert,update,
references |         |
| date  | datetime | NULL            | YES  |     | NULL    |                | select,insert,update,
references |         |
+-------+----------+-----------------+------+-----+---------+----------------+----------------------
-----------+---------+
4 rows in set (0.19 sec)

 

 

mysql> show variables like 'char%';

除了character_set_filesystem | binary,一般要求其他項都是 utf8,通過按照前文的 2.setup 修改 my.ini 可以永久生效。

 

mysql> set names utf8; 

一次性修改 character_set_client, character_set_connection, and character_set_results

mysql> help set names
Name: 'SET NAMES'
Description:
Syntax:
SET NAMES {'charset_name'
    [COLLATE 'collation_name'] | DEFAULT}

This statement sets the three session system variables
character_set_client, character_set_connection, and
character_set_results to the given character set. Setting
character_set_connection to charset_name also sets collation_connection
to the default collation for charset_name. See
http://dev.mysql.com/doc/refman/5.5/en/charset-connection.html.

The optional COLLATE clause may be used to specify a collation
explicitly. If given, the collation must one of the permitted
collations for charset_name.

charset_name and collation_name may be quoted or unquoted.

The default mapping can be restored by using a value of DEFAULT. The
default depends on the server configuration.

ucs2, utf16, and utf32 cannot be used as a client character set, which
means that they do not work for SET NAMES.

URL: http://dev.mysql.com/doc/refman/5.5/en/set-names.html

 

(2)在Windows cmd 插入或查詢中文出現亂碼

mysql insert中文亂碼無法插入ERROR 1366 (HY000): Incorrect string value: '\xB1\

需要每次連接后輸入如下:

set character_set_client = gbk;
set character_set_results = gbk;

(3)更改數據庫編碼

ALTER DATABASE db_name CHARACTER SET [=] charset_name

ALTER DATABASE db_name COLLATE [=] collation_name

僅對當前連接有效,實際意義???:set character_set_database = utf8;

(4)更改表編碼

MySQL 中文顯示亂碼  看評論!

ALTER TABLE tbl_name  CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM