Encoding Issues To Connect MySQL With Python

使用Python連線到MySQL資料庫常見的編碼問題

目錄

    原始文章

    使用Python連線到MySQL資料庫常見的編碼問題


    連接資料庫

    資料庫類型有很多種,像是MySQL、Oracle。即使是同一種資料庫類型,在Python中也有多種套件可以使用,像是MySQLdbPyMySQLSQLAlchemyMySQL Connector Python,但整體而言,語法都大同小異,畢竟資料庫連線所需的資訊不外乎是IP、資料庫名稱、使用者帳號與密碼等。在Python中使用MySQLdb的基本語法大致如下,記得execute裡面的SQL語法一定要加上冒號,否則會出錯。我也在這個愚蠢的錯誤上跌倒過。

    import MySQLdb
    db = MySQLdb.connect(
          host = '主機IP或網址',
          user = '資料庫帳號',
          passwd = '資料庫密碼',
          db = '資料庫名稱')
    cursor = db.cursor()
    cursor.execute("SELECT * FROM table_name;")

    編碼問題

    編碼問題是資料庫管理中常見的問題,編碼包含又包含了兩個部份,collation和character set。關於這兩者的差別,可以參考這篇文章,〈What is the difference between collation and character set?〉

    使用MySQLdb的Insert匯入資料時,因為中文和英文的編碼不同,可能會出現錯誤訊息如下:

    cursor.execute("INSERT INTO table_name (col1, col2, col3) VALUES ('台北', '台南', '高雄');")
    > UnicodeEncodeError: 'latin-1' codec can't encode characters in position 50-51: ordinal not in range(256)

    1) 檢查Collation

    USE database_name;
    SELECT @@character_set_database, @@collation_database;
    Python使用MySQLdb連線到MySQL的常見問題-2
    ALTER DATABASE database_name CHARACTER SET utf8 COLLATE utf8_general_ci;

    2) 檢查Charater Set

    SHOW FULL COLUMNS FROM table_name;
    Python使用MySQLdb連線到MySQL的常見問題-1
    ALTER TABLE table_name CHARACTER SET utf8, COLLATE utf8_general_ci;

    3) 直接在MySQL Insert看看

    可以直接把SQL Query丟到MySQL的介面執行,而不是透過Python。如果成功,代表資料庫的編碼其實是正確的。

    INSERT INTO table_name (col1, col2, col3) VALUES ('台北', '台南', '高雄');

    4) 在MySQLdb.connect中增加參數

    db = MySQLdb.connect(
        host = '主機IP或網址',
        user = '資料庫帳號',
        passwd = '資料庫密碼',
        db = '資料庫名稱',
        charset = 'utf8')

    fetch all

    執行Query時,以下這行SQL只會回傳這張table的總資料筆數。

    cursor.execute("SELECT * FROM table_name;")

    不要緊張,其實一切都正常運作,只要加上以下這行就可以了。

    table = cursor.fetchall()

    commit

    使用MySQLdb在MySQL中新增資料時

    cursor.execute("INSERT INTO table_name (col1, col2, col3) VALUES (3, 4, 5);")

    新增後,在Python中檢查一切正常,但到MySQL中卻發現資料根本沒有被寫進資料庫。再一次地,不要緊張,加上這行就可以了。注意,這裡的db會對應到最上面,使用MySQLdb.connect建立連線時的變數名稱。

    db.commit()



    推薦文章

    Aron

    搭載商業思維的資料科學家,工業設計系畢業,曾任職知名品牌行銷企劃。下班後寫機器學習模型,寫網站,也寫文章。興趣是把Side Project當成創業題目來玩,把人生當成遊戲破關。

    facebook telegram

    推薦書單

    用生活常識就能看懂財務報表
    用生活常識就能看懂財務報表 ⭐⭐⭐⭐
    《三體》系列套書
    《三體》系列套書 ⭐⭐⭐⭐⭐
    蘭亭序殺局 卷一:玄甲衛
    蘭亭序殺局 卷一:玄甲衛 ⭐⭐⭐⭐⭐
    七侯筆錄之筆靈(上)
    七侯筆錄之筆靈(上) ⭐⭐⭐⭐⭐

    發佈留言

    • * 表示必填欄位
    • 您填寫的電子郵件不會被公開
    • 請確認您的電子郵件正確無誤,當您的留言收到新的回覆時,我們會寄送通知信件給您

    發佈留言必須填寫的電子郵件地址不會公開。