2011-10-05 26 views
0

我有一個MS SQL Server 2008數據庫,從中我使用perl DBD :: Sybase模塊獲取數據。但是在數據庫中有一些特殊字符,例如版權符號,商標符號等,這些字符不能正確導入。 Perl似乎將所有這些特殊字符都改爲問號字符。有沒有辦法來解決這個問題?使用Perl從MS SQL Server獲取數據時的特殊字符處理DBD

我試過在連接字符串中指定charset=utf8。該doc提到了syb_enable_utf8 (bool)設置,但每當我嘗試,我得到一個錯誤:

Can't locate object method "syb_enable_utf8" via package "DBI::db" 
+0

確保您已閱讀此內容:http://perldoc.perl.org/perlunicode.html –

回答

1

一個解決方案,我發現是這樣的:

use Encode qw(encode_utf8); 

然後,無論你是將數據寫入一個文件或其他地方,請使用Encode::encode_utf8($data);

其中$data是您從MSSQL中提取的列/值。

0

我不使用DBD :: Sybase,但a)我使用了很多其他DBD和b)我目前正在收集有關DBD中unicode支持的信息。根據該窗格,使用syb_enable_utf8時至少需要OpenClient 15.x。你使用15.x或更高版本?如果您的客戶端小於15.x,或者您的DBD :: Sybase版本太舊,也許syb_enable_utf8未定義。不幸的是,當添加了syb_enable_utf8時,我無法從Changes文件中看到。

但是,當您說「找不到方法」時,我認爲這是一個線索,因爲syb_enable_utf8不是方法,它是pod中的一個屬性(它位於Sybase特定屬性下)。所以,你需要通過連接將其添加到您的連接調用,或將其處理是這樣的:

my $h = DBI->connect("dbi:Sybase:something","user","password", {syb_enable_utf8 => 1}); 

$h->{syb_enable_utf8} = 1; 

你也應該閱讀莢位描述當syb_enable_utf8是什麼情況從文檔中看來它只適用於UNIVARCHAR,UNICHAR和UNITEXT列。

最後,您需要確保您首先正確插入數據。我猜想如果它沒有從Perl中插入,使用syb_enable_utf8和charset = utf8,並且在插入之前,您的數據不是Perl中正確的unicode字符,將會返回垃圾。

Raze2dust所做的評論與您的​​問題無關,但值得注意的是,如果您要將從您的數據庫檢索到的數據寫入其他地方,請注意。只要記住解碼輸入到腳本的任何數據並對任何數據輸出進行編碼。