1

我有一个 MySQL 'articles' 表,我正在尝试使用 SQLyog 进行以下插入。

insert into articles (id,title) values (2356606,'Jérôme_Lejeune');

这工作正常,当我进行选择查询时数据显示正常。

问题是,当我通过我的 perl 脚本执行相同的插入查询时,名称会出现一些垃圾字符,而不是数据库中的 é 和 ô。我需要知道如何通过我的脚本正确存储名称。执行插入的代码部分是这样的。

$sql_insert = "insert into articles (id,title) values (?,?)";
$sth_insert = $dbh->prepare($sql_insert);
$sth_insert->execute($id,$title);

$id 和 $title 具有正确的所需数据,我在插入它们之前已通过打印检查过这些数据。请协助。

4

2 回答 2

3

你已经打开了蠕虫的字符编码罐,在你解决这个问题并让它得到解决之前,你需要学习很多东西。

您可能已经习惯于思考如何将文本字符编码为一串位。例如在ASCII编码下,使用8位字符串01000001(65)来表示A字符。当您开始考虑有多少种不同的语言以及有多少种不同的字符时,您很快就会意识到 8 位编码不会让您走得太远。因此,许多其他字符编码已经激增。一些最受欢迎的是latin1(ISO-8859-1)UTF-8. 这两种编码都可以呈现éô字符,但它们使用完全不同的位串来表示它们。当您写入文件(或终端)或向数据库添加一行时,Perl 和 MySQL 对输出流的字符编码有一个概念。读取数据时也会使用编码。如果您不知道这种编码是什么,那么在存储和检索数据时说数据看起来不错/看起来很糟糕是没有任何意义的。

Perl 和 MySQL 可以通过正确的设置处理这两种编码以及更多。您选择使用哪种编码并不像确保应用程序的所有部分都使用相同的编码那么重要。但是你应该选择一种编码

  1. 可以编码你需要的所有字符(对于这个问题,你提到了éand ô,但是还有其他的吗?将来呢?)
  2. 应用程序的所有部分(前端、数据库、后端)都支持

以下是一些建议阅读,可帮助您朝着正确的方向前进:

我不能对 MySQL 说太多,但是 Perl 中的字符编码支持正在迅速发展(这并不是说它不好)。最新版本的 Perl 将对 ASCII 以外的字符提供最好的支持(对于最晦涩的字符集)和最好的特性(例如,正则表达式和字符类)。

于 2012-10-31T03:08:14.050 回答
1

有几件事要遵循。

首先,您必须确保 Perl 理解在您的程序和 DB 之间移动的数据被编码为 UTF-8(我希望您的数据库和表设置正确)。为此,您需要在连接到数据库时大声说出来,如下所示:

 my($dbh) = DBI->connect(
     'dbi:mysql:test',
     'user',
     'password',
     {
         mysql_enable_utf8 => 1,
     }      
);

接下来,您需要将数据发送到输出,并且必须将其设置为将数据解码为 UTF-8。为此,我喜欢非常好的模块:

use utf8::all;

但是这个模块不是核心,所以你可能也想自己设置它binmode

binmode STDIN, ":utf8"; 
binmode STDOUT, ":utf8"; 

如果您处理网页,则必须确保该浏览器理解您正在发送编码为 UTF-8 的数据。为此,您应该确保您的 HTTP 标头包含编码:

Content-Type: text/html; charset=utf-8;

并使用 HTML META-tag 设置它:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

现在你应该把你的路盖好。

于 2012-10-31T20:15:57.883 回答