首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Perl DBI 操作 MySQL 實戰技巧:UTF-8、特殊字元、自動重連

     編輯:MySQL 資料庫相關知識

使用 Perl DBI 連接 MySQL 時,常遇到字元編碼亂碼、特殊字元寫入報錯、長連線逾時中斷等問題。本文整理三大實戰 TIPS 解決方案。

TIPS 1:UTF-8 環境下正確處理編碼

在腳本開頭加入:

use utf8;
binmode(STDOUT, ':encoding(utf8)');
binmode(STDIN,  ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');

作用:宣告原始碼為 UTF-8,並將標準輸入/輸出/錯誤流設為 UTF-8 編碼層,確保從 MySQL 讀取的 UTF-8 資料正確顯示,避免亂碼。

TIPS 2:特殊字元安全寫入

使用預處理語句 + 佔位符 ?,配合 qq// 引用字串:

my $sth = $dbh->prepare("INSERT INTO wubx.WeekEvent VALUES(?,?,?,?,?,?,?)");
$sth->execute($OId, $CId, qq/$Time/, $EventType, qq/$CDesc/, $PId, $RFlag);

優點:

  • 預處理語句自動處理引號轉義,防 SQL 注入。
  • qq// 可包含任意字元(含單雙引號),減少手動轉義錯誤。
  • 分離 SQL 邏輯與資料,效能更好(可重複執行計劃)。

TIPS 3:連線自動重連與逾時調整

問題:長時間運行的腳本遇到 MySQL server has gone away(預設 wait_timeout=28800 秒)。

方案 A:DBD::mysql 4.012+ 內建自動重連

$dbh->{mysql_auto_reconnect} = 1;

方案 B:舊版模組調整 Session 逾時

$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 將更穩健、安全。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved