跳到主要內容

發表文章

目前顯示的是 7月, 2014的文章

Python MySQLdb SQL裡含有特殊字元的處理

在文本的處理中,無論是網路上抓取的資料,還是由實際資料轉換而來的文本,已結構化處理的資料我都習慣放至資料庫中儲存和管理。一直以來都很習慣的使用 PHP 語言來做資料的整理和處理,一方面是因爲最熟悉這個語言,一方面是 PHP 也可以很容易的做成網頁來呈現結果。 而有些近來處理的資料,需要經過中文斷詞(中文分詞)的處理,雖然 PHP 已有人發展出 SCWS 中文分詞工具,主要運用在 GBK 和 UTF-8 上,對於繁體中文的斷詞目前則不如其他工具來的好用。也因此我最近選擇了 Python 作爲文本處理的主要語言,使用 JieBa 這套斷詞工具(斷詞的細節在這裡我就不多琢磨)。以往 PHP 操作 MySQL 的方式現在要改成 Python 了,也還好 python 有 MySQLdb Library 來幫助操作。 在 PHP 中爲了避免 Single quote 或是 double quote 等特殊字元可能造成 SQL injection,多半會使用  addslashes() 或 mysqli::real_escape_string() 函數來事先處理。而在 python 的 MySQLdb 中也有雷同的函數 MySQLdb.escape_string() 可是使用來跳脫特殊字元,我所處理的文本資料是 utf-8 編碼,在第一次使用就出現了如下的錯誤訊息: MySQLdb.escape_string(sql) UnicodeEncodeError: 'ascii' codec can't encode character... 讓我傷透了腦筋以爲是 unicode 造成的問題,陸續找了其他像 replace 或 regular expression 的方式來替換,也試過字串以參數代入的方式,但都無法盡善盡美。 最後我又回到了這個錯誤訊息,錯誤訊息總是會有解答的 Hint :)。 原來 MySQLdb.escape_string() 試圖將 query 的內容 encode 成字串,預設使用的 encode 編碼是 ascii,而我們所使用的 query 無法被 encode 成 ascii 而產生錯誤。所以我們 必須告訴 MySQLdb 要使用的編碼是 utf-8 ,方法如下: MySQLdb.escape_s

安裝 MariaDB 10.1 與解決套件 unmet dependencies 問題

自從昇陽(Sun)公司被併購入 Oracle 之後對於很多原本的 Open Source 專案都有莫大的影響,加上 Oracle 公司本身主要的產品是資料庫,因此,許多使用者都開始感到擔心 MySQL 這個許多專案都愛用的資料庫軟體,有朝一日會開始朝向收費一途前進,MySQL 在去年的版本更新時偷偷更換了 GPL 授權一事( MySQL man pages silently relicensed away from GPL ),相信不少人的心爲之一振,萌生離去的念頭 。 Oracle 並不是第一次驅使使用者離去,已有 OpenOffice 和 OpenSolaris 的前車之鑑,於是決定開始先熟悉與嘗試由 MySQL 元老 Michael Widenius 發起的 MariaDB。其中 Oracle 帶來的風風雨雨和變動,網路已有不少網友心痛分享在此則不再多做贅述。 MariaDB 由一開始的 MySQL 分支,保持和 MySQL 相同的版本號以維持使用者對於兩個資料庫相容的認知。在 2013 年 4 月 SKySQL 和 MariaDB 的原開發公司 Monty Program Ab 合併 後,便共同開發下一代的 MariaDB。在今年 2014 年 3 月的時候釋出 MariaDB 10 的新版本號,由 5.5 直接跳至 10,也象徵著一個全新的開始。在 MariaDB 10 中主要新增了 3 個新的特色:( 參考資料 ) 新增高效複製功能,可以平行複製資料以及更先進的集體提交功能(Group Commit)。 增加原生NoSQL支援。新版增加了Connect 引擎來做外部資料管理。 內建分片(Sharding)功能,提升對分散式架構的支援。 在這次的安裝中,我選擇了 MariaDB 10.1 的版本號在 uBuntu 14.04 Desktop x64 中安裝。10.1 是建立在 MariaDB 10.0 和源自 MySQL 5.6、5.7 的功能以及一些新功能( 更新記錄 )。安裝方式是使用官方提供的方式,加入 Mirror 的 Repositories 來安裝( Repository Configuration Tool ),跟著步驟一個一個點選安裝即可。 不曉得之前是否有安裝其他軟體造成衝突,在 sudo apt-get in