【问题标题】:Russian UTF8 and mySQL - why doesn't it work properly?俄罗斯 UTF8 和 mySQL - 为什么它不能正常工作?
【发布时间】:2017-02-22 06:30:29
【问题描述】:

到目前为止,我的 mySQL 数据刚刚使用 ISO-8859-1,但现在我们开始收到俄语订单,这导致字符显示为? (尝试打印发票时效果不佳!)

所以,我一直在考虑将表格转换为 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;

当导入它时,我仍然有损坏的字符。然后我看到了这个帖子:

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

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

所以现在,你可以看看它是如何保存的:

我现在遇到的问题是正确获取数据!

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

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

我得到的是:

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

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

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

...但 PDF 版本已损坏:

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

【问题讨论】:

    标签: perl utf-8


    【解决方案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; }
    

    唷,很高兴这样排序! :)

    【讨论】:

      【解决方案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 才能获得相同的效果。

      【讨论】:

      • 感谢您的回复。我实际上正在使用这个:$CONN{$conn_key} = DBI->connect($dsn, $self->{connect}->{login}, $self->{connect}->{password}, { RaiseError => $self->{connect}->{RaiseError}, PrintError => $self->{connect}->{PrintError}, AutoCommit => 1, mysql_enable_utf8 => 1 })。它似乎不起作用。我想知道是否值得试一试“正确的”DBI 模块,而不是使用第 3 方模块。
      • 你已经通过mysql_enable_utf8。这看起来是正确的。可能是 Data::Dumper 没有正确处理它?我不知道。试试这个:use utf8; use Data::Dumper::AutoEncode; print eDumper($invoice->{address});
      • 谢谢。有趣的是,我添加了一些调试,看起来地址设置正确:地址:Matveenkova,Сумской,д。 21, корп. 2、кв。 90,Москва,xxxx,俄罗斯联邦`。问题似乎出在实际的模板解析器上。我会继续挖掘#
      • 感谢您与我一起经历这一切。这似乎是 DOMPDF 的一个问题:stackoverflow.com/questions/990181/…。我会做一些挖掘,看看什么解决方案会起作用:)
      • 我明白了 :) github.com/dompdf/dompdf/issues/698 。我会在一分钟内写一个正确的答案
      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 2017-08-11
      • 2013-07-28
      • 1970-01-01
      • 2019-11-21
      • 2018-03-02
      • 1970-01-01
      • 2015-08-26
      相关资源
      最近更新 更多