2

我正在使用 Spreadsheet::Read 从 Excel(xls 或 xlsx)文件中获取数据,并使用 DBI 将它们放入 MySQL 数据库中。

如果我将数据打印到控制台,它会正确显示所有特殊字符,但是当我将其插入数据库时​​,某些文件最终会出现损坏的字符。例如,"Möbelwerkstätte"变成"Möbelwerkstätte"

我认为Spreadsheet::Read“知道”哪个字符集从文件中出来,因为它每次都能正确打印到控制台,而不管文件编码如何。如何确保它以 UTF-8 格式进入数据库?

4

2 回答 2

2

您已经收到(并接受)的答案可能大部分时间都可以使用,但它有点脆弱并且可能仅适用,因为 Perl 的内部字符表示很像 UTF-8。

要获得更强大的解决方案,您应该阅读Perl Unicode 教程并遵循其中的建议。它们归结为:

  • 解码从程序外部获得的任何数据
  • 对您从程序中发送的任何数据进行编码

在您的情况下,您需要解码从电子表格中读取的数据并对发送到数据库的数据进行编码。

于 2013-05-22T13:49:13.050 回答
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

于 2013-05-22T07:03:36.380 回答