用perl通過dbi寫mysql資料庫時,如果內容的編碼方式與系統的編碼方式不一致,資料庫中就會出現亂碼
結果方法如下:
在連線資料庫後,寫入資料前,設定連線引數
$dbh->do("setnames 'gbk'");
原因說明來自下面這篇文章:
先說mysql的字符集問題。windows下可通過修改my.ini內的
# client section
[mysql]
default-character-set=utf8
# server section
[mysqld]
default-character-set=utf8
這 兩個欄位來更改資料庫的預設字符集。第乙個是客戶端預設的字符集,第二個是伺服器端預設的字符集。假設我們把兩個都設為utf8,然後在mysql command line client裡面輸入「show variebles like 「character_set_%」;」,可看到如下字元:
character_set_client latin1
character_set_connection latin1
character_set_database utf8
character_set_results latin1
character_set_server utf8
character_set_system utf8
其 中的utf8隨著我們上面的設定而改動。此時,要是我們通過採用utf-8的php程式從資料庫裡讀取資料,很有可能是一串「?????」 或者是其他亂碼。網上查了半天,解決辦法倒是簡單,在連線資料庫之後,讀取資料之前,先執行一項查詢「set names utf8」,即在php裡為
mysql_query("
set names utf8")
;即可顯示正常(只要資料庫裡資訊的字元正常)。為什麼會這樣?這句查詢「set names utf8」到底是什麼作用?
到mysql 命令列輸入「set names utf8;」,然後執行「show variebles like 「character_set_%」;」,發現原來為latin1的那些變數「character_set_client」、 「character_set_connection」、「character_set_results」的值全部變為utf8了,原來是這3個變數在搗 蛋。查閱手冊,上面那句等於:
setcharacter_set_client
= utf8
;set
character_set_results
= utf8
;set
character_set_connection
= utf8
;看看這3個變數的作用:
資訊輸入路徑:client→connection→server;
資訊輸出路徑:server→connection→results。
換 句話說,每個路徑要經過3次改變字符集編碼。以出現亂碼的輸出為例,server裡utf8的資料,傳入connection轉為latin1,傳入 results轉為latin1,utf-8頁面又把results轉過來。如果兩種字符集不相容,比如latin1和utf8,轉化過程就為不可逆的, 破壞性的。所以就轉不回來了。
但這裡要宣告一點,「set names utf8」作用只是臨時的,mysql重啟後就恢復預設了。
接 下來就說到mysql在伺服器上的配置問題了。豈不是我們每次對資料庫讀寫都得加上「set names utf8」,以保證資料傳輸的編碼一致?能不能通過配置mysql來達到那三個變數預設就為我們要想的字符集?手冊上沒說,我在網上也沒找到答案。所以, 從伺服器配置的角度而言,是沒辦法省略掉那行**的。
perl連線mysql資料庫
首先需要安裝 ppm install dbd mysql use strict usedbi my host localhost 主機位址 my driver mysql 介面型別 預設為 localhost my database runoob 資料庫 驅動程式物件的控制代碼 my dsn dbi...
使用Perl連線Mysql資料庫
後台資料庫轉為mysql,現在使用perl連線資料庫就方便多了。通過dbi,perl可以很容易的連線到資料庫 bin perl use dbi connect to target db my dbh dbi connect dbi mysql database eygle host localhos...
linux下perl操作mysql資料庫
假定 以安裝好perl語言和mysql資料庫。dbi安裝 dbi詳細資訊參考 wget 2 解壓 tar xzf dbi 1.620.tar.gz 3 進入解壓包內,perl makefile.pl 4 make test 5 make 6 make install 如果不是root使用者,要sud...