俄语UTF8和mySQL - 为什么它不能正常工作?

时间:2016-10-13 08:22:14

标签: perl utf-8

到目前为止,我刚刚使用ISO-8859-1作为我的mySQL数据,但现在我们已经开始获得俄罗斯订单,导致角色显示为? (尝试打印发票时效果不佳!)

所以,我一直在研究将表转换为UTF8。我的表结构非常简单:

DROP TABLE IF EXISTS `glinks_AdminSystemEBay`;
CREATE TABLE IF NOT EXISTS `glinks_AdminSystemEBay` (
  `ebay_transaction_id` bigint(20) NOT NULL DEFAULT '0',
  `paypal_trans_id_fk` varchar(200) DEFAULT NULL,
  `payer_email` varchar(200) DEFAULT NULL,
  `date_paid` varchar(200) DEFAULT NULL,
  `shipping_paid` varchar(200) DEFAULT NULL,
  `address` varchar(200) DEFAULT NULL,
  `product_id_purchased` int(11) DEFAULT NULL,
  `payment_amount` float DEFAULT NULL,
  `total_amount` float DEFAULT NULL,
  `been_added_to_system` int(11) DEFAULT NULL,
  `sale_from` varchar(25) DEFAULT NULL,
  `product_id` bigint(20) DEFAULT NULL,
  `currency` varchar(10) DEFAULT NULL,
  `paypal_fee` float DEFAULT NULL,
  `units_sold` int(11) DEFAULT NULL,
  `ebay_fees` float DEFAULT NULL,
  `item_name` longtext,
  `been_emailed` tinyint(4) NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

enter image description here

导入时,我仍然有破碎的字符。然后我发现了这篇文章:

http://www.shawnolson.net/a/946/unicode_data_with_php_5_and_mysql_41.html

我以前不知道需要SET NAMES 'utf8'。这修复了“保存”部分(在查询之前运行它)

现在,您可以看到它的保存方式:

enter image description here

我现在遇到的问题是正确地恢复数据!

作为测试,我只是从数据库抓取记录,然后做一个转储器:

print $IN->header;
use Data::Dumper;
print Dumper($invoice->{address});

我得到的只是:

$VAR1 = 'Matveenkova ,??????? ??????, ?. 21, ????. 2, ??. 90, ??????, 117208, Russian Federation';

我真的很困惑我做错了什么!任何人都能解释一下吗?

更新:好的,所以看起来这个问题实际上来自我们的PDF生成器(DOMPDF)。它在HTML版本中很好:

enter image description here

...但PDF版本已损坏:

enter image description here

我会向他们提交错误报告,看看他们是否可以提供帮助:)。

2 个答案:

答案 0 :(得分:2)

如果您正在使用DBD::mysql,请执行

$dbh->{'mysql_enable_utf8'} = 1;
  

此属性确定DBD :: mysql是否应该假设存储在数据库中的字符串是utf8。此功能默认为关闭

     

设置后,从文本列类型(char,varchar等)检索的数据将在必要时打开UTF-8标志。这将在该字符串上启用字符语义。您还需要确保将数据库/表/列配置为使用UTF8。有关MySQL手册中字符集支持的更多信息,请参阅:http://dev.mysql.com/doc/refman/5.7/en/charset.html

     

此外,打开此标志会告诉MySQL应将传入数据视为UTF-8。这只有在用作connect()调用的一部分时才会生效。如果在连接后打开标志,则需要发出命令SET NAMES utf8以获得相同的效果。

答案 1 :(得分:1)

好的,经过大量的调试(感谢Chankey)后,我终于把它固定下来了。

问题根本不在于数据库 - 它与我正在使用的PDF创建者有关。基本上,我在做:

  • 将数据从eBay API保存到数据库
  • 从DB
  • 中选择数据库
  • 创建发票的HTML模板
  • 使用DOMPDF
  • 创建PDF版本(基于HTML模板)

经过一番环顾,我发现了一些其他人在DOMPDF中遇到俄语问题。我找到了:

DOMPDF problem with Cyrillic characters

最终解决方案是确保我使用最新版本的DOMPDF,然后在HTML页面中,我必须确保使用* DejaVu *字体,因为它支持俄语。

html { font-family : DejaVu Sans, Helvetica, sans-serif; overflow: auto; }
Phew,很高兴分类! :)