2013-05-21 380 views
2

我使用電子表格::讀取處理,以從Excel(XLS或XLSX)文件獲取數據,並使用DBI把它們放在一個MySQL數據庫。的Perl的Unicode與DBI

如果我的數據打印到控制檯,它會顯示所有特殊字符正常,但是當我將其插入到數據庫中,一些文件結束了亂碼。例如,"Möbelwerkstätte"變爲"Möbelwerkstätte"

我認爲Spreadsheet::Read「知道」哪個字符集出來的文件,因爲它每次正確打印到控制檯,無論文件編碼如何。我如何確保它以UTF-8進入數據庫?

+0

我相信DBI(和DBD :: MySQL)默認爲Latin1。發送「USE NAMES utf8」作爲您的第一個查詢。您也可以在my.cnf中啓用它,請參閱MySQL文檔。 –

+0

您還需要確保數據庫模式具有[正確的字符集](http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html)(默認字符集是拉丁-1。) – friedo

+0

謝謝@AndyThompson,那工作。如果你把它寫成一個問題,我會接受它。 :-) –

回答

1

兩個DBI和DBD :: MySQL的默認Latin1的(與Latin1的編譯)。
通過發送「USE NAMES utf8」作爲您的第一個查詢,您將更改該會話。

從手冊:

SET NAMES表示的字符集的客戶端將使用SQL語句發送到服務器。因此,SET NAMES的'cp1251'告訴服務器,「來自這個客戶端的未來傳入消息使用字符集cp1251」。它還指定了服務器用於將結果發送回客戶端的字符集。 (例如,它表示什麼字符集使用的列值,如果你使用SELECT語句。)

的完整文檔見http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

2

您已經收到(並接受)答案已經可能會工作的大部分時間,但它是一個有點脆弱,大概只能是因爲Perl的內部字符表示很像UTF-8。

對於更強大的解決方案,你應該閱讀Perl Unicode Tutorial,並按照在那裏的建議。他們歸結爲:

  • 解碼,你從你的程序
  • 編碼你發送你的程序

在你的情況下,任何的數據以外的任何數據,你會想解碼您從電子表格中讀取的數據並對要發送到數據庫的數據進行編碼。