簡體   English   中英

Perl DBI / Mysql Unicode錯誤

[英]Perl DBI/Mysql Unicode Bug

我不確定這是一個錯誤還是做錯了什么:

我讀取數據

open my $fh, "<:encoding(iso-latin1)", $file or die "Failed to open $file: $!";

$ file絕對在iso-latin1中。

然后我有一個mysql表是

ENGINE=InnoDB AUTO_INCREMENT=53072 DEFAULT CHARSET=latin1

我檢查連接設置:

$dbh->prepare("show variables");

這使

character_set_client, latin1
character_set_connection, latin1
character_set_database, latin1
character_set_filesystem, binary
character_set_results, latin1
character_set_server, latin1
character_set_system, utf8

所以對我來說,一切都應該沒問題:

  • 表是iso-latin1
  • 數據為iso-latin1(現在應為perl內部字符格式)
  • 連接信息顯示正確的設置
  • 輸出到STDOUT(端子為iso-latin1)是正確的

但是:表中的數據是純utf8(在這種情況下,很可能是perl的內部格式)。

我是否錯過了某些東西,這可能是DBI / DBD :: mysql中的錯誤?

我的猜測是您是對的,並且此數據采用Perl的內部字符格式。 順序是這樣的。

  • 輸入文件中的數據以Latin-1字節存儲
  • 由於open語句上的編碼選項,從輸入文件讀取數據並自動將其轉換為Perl字符
  • 數據作為Perl字符發送到MySQL
  • MySQL通過獲取UTF8而不是Latin-1有點困惑,但是無論如何都盡可能地存儲它

您缺少的步驟是在將Perl字符發送到數據庫之前將其編碼回Latin-1。 顯而易見的解決方案是對您發送到數據庫的每個值調用encode('iso-885901', $string) 如果有某種自動編碼選項,那就太好了。 但是我找不到。

當然,如果您的數據全部為Latin-1,那么您可以考慮忽略任何解碼/編碼問題。 一切都應該沒有這種復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM