我的脚本肯定以UTF-8保存。我用"{$this->engine}:host={$this->host};dbname={$this->name};charset=UTF-8"
实例化PDO。我的表使用InnoDB,并使用utf8_general_ci进行整理。我的网页会以Content-Type: text/html; charset=UTF-8
标题或<meta>
等效标题发送。
当使用PDO存储源自HTTP输入或源代码中的字符串文字的€字符时,根据MySQL Workbench 5.2,我留下了c3 a2 e2 80 9a c2 ac
。从数据库中检索并在页面上显示它可以正常工作。然而在phpMyAdmin和Workbench中,我看到€
。
当使用这两个工具来存储€时,我留下了e2 82 ac
,这显然是正确的UTF-8表示,但如果我尝试检索然后用PHP输出,则会显示
我的问题是,这种差异从何处出现,是否可以使我的网页和数据库工具完美运行?
答案 0 :(得分:1)
DSN中的charset指令实际上适用于MSSQL。我只需要执行SET NAMES
。对不起。
我实现了这一点:
parent::__construct("{$this->engine}:host={$this->host};dbname={$this->name}",
$this->user, $this->password,
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"));
答案 1 :(得分:0)
简单地说,将€转换为html实体和欧元;对于超级修复(但你可能会遇到其他特殊字符的问题)
问题的另一面(更具体地说)是检查mysql character_set_server和最常见原因character_set_client - 请参阅:connection charsets
另外,重要的是要注意meta equiv没有区别,你需要总是设置标题('Content-Type:...)
答案 2 :(得分:0)
由于您的HTML页面正确,您似乎正在将正确的数据存储在数据库中。
€
是欧元符号的UTF-8编码被误解为windows-1252。您的Windows工具似乎使用“ANSI”编码而不是数据库编码。