到目前为止,我刚刚使用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;
导入时,我仍然有破碎的字符。然后我发现了这篇文章:
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版本已损坏:
我会向他们提交错误报告,看看他们是否可以提供帮助:)。
答案 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创建者有关。基本上,我在做:
经过一番环顾,我发现了一些其他人在DOMPDF中遇到俄语问题。我找到了:
DOMPDF problem with Cyrillic characters
最终解决方案是确保我使用最新版本的DOMPDF,然后在HTML页面中,我必须确保使用* DejaVu *字体,因为它支持俄语。
html { font-family : DejaVu Sans, Helvetica, sans-serif; overflow: auto; }
Phew,很高兴分类! :)