【问题标题】:Perl unicode handling with DBI使用 DBI 处理 Perl unicode
【发布时间】:2013-05-21 13:26:23
【问题描述】:

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

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

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

【问题讨论】:

  • 我相信 DBI(和 DBD::MySQL)默认为 Latin1。发送“USE NAMES utf8”作为您的第一个查询。您也可以在 my.cnf 中启用它,请参阅 MySQL 文档。
  • 您还需要确保数据库架构具有 correct charset(默认字符集为 Latin-1。)
  • 谢谢@AndyThompson,这行得通。如果你把它写成一个问题,我会接受它。 :-)
  • @friedo:数据库已经在 utf8 中。不过还是谢谢。

标签: perl encoding


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2014-12-12
      • 2017-06-24
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2012-08-09
      相关资源
      最近更新 更多