使用 Perl DBI 連接 MySQL 時,常遇到字元編碼亂碼、特殊字元寫入報錯、長連線逾時中斷等問題。本文整理三大實戰 TIPS 解決方案。
在腳本開頭加入:
use utf8; binmode(STDOUT, ':encoding(utf8)'); binmode(STDIN, ':encoding(utf8)'); binmode(STDERR, ':encoding(utf8)');
作用:宣告原始碼為 UTF-8,並將標準輸入/輸出/錯誤流設為 UTF-8 編碼層,確保從 MySQL 讀取的 UTF-8 資料正確顯示,避免亂碼。
使用預處理語句 + 佔位符 ?,配合 qq// 引用字串:
my $sth = $dbh->prepare("INSERT INTO wubx.WeekEvent VALUES(?,?,?,?,?,?,?)");
$sth->execute($OId, $CId, qq/$Time/, $EventType, qq/$CDesc/, $PId, $RFlag);
優點:
qq// 可包含任意字元(含單雙引號),減少手動轉義錯誤。問題:長時間運行的腳本遇到 MySQL server has gone away(預設 wait_timeout=28800 秒)。
$dbh->{mysql_auto_reconnect} = 1;
$dbh->do('SET SESSION wait_timeout=72000');
$dbh->do('SET SESSION interactive_timeout=72000');
適用場景:任何語言連 MySQL 遇到短期連線丟失或伺服端 timeout 設定過短時,皆可在連線建立後執行上述 SET 指令延長存活時間。
use DBI;
use utf8;
binmode(STDOUT, ':encoding(utf8)');
my $dsn = "DBI:mysql:database=test;host=localhost;port=3306;mysql_enable_utf8=1";
my $dbh = DBI->connect($dsn, 'user', 'pass', {
RaiseError => 1,
PrintError => 0,
AutoCommit => 1,
mysql_auto_reconnect => 1,
});
$dbh->do('SET SESSION wait_timeout=72000');
# ... 後續操作
$dbh->disconnect;
掌握這三招,Perl 操作 MySQL 將更穩健、安全。