-
02-10-2019 - |
题
我的脚本肯定保存在UTF-8中。我正在实例化PDO "{$this->engine}:host={$this->host};dbname={$this->name};charset=UTF-8"
. 。我的桌子使用InnoDB,并使用UTF8_General_Ci进行整理。我的页面发送给 Content-Type: text/html; charset=UTF-8
标题或 <meta>
相等的。
当使用PDO存储源自HTTP输入或源代码中字符串字符串的€字符时,我随身携带 c3 a2 e2 80 9a c2 ac
根据MySQL Workbench 5.2。从数据库中检索它并在页面上显示它的工作正常。然而,在phpmyadmin和Workbench中,我看到了 €
.
当使用这两个工具存储€时,我留下了 e2 82 ac
, ,这显然是正确的UTF-8表示形式,但是如果我尝试检索然后使用PHP输出,则会显示。
我的问题是,从哪里出现这种差异,是否有可能使我的网页和数据库工具都完美地工作?
解决方案
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'"));
其他提示
简而言之,将€转换为SuperFix的HTML实体€(但您可能会与其他特殊字符遇到问题)
问题的另一面(更具体地说)是检查MySQL targin_set_server 最常见的原因 targin_set_client - 也可以看看: 连接charset
另外,重要的是要注意,元等等没有区别,您需要 总是 设置标题('content-type:...)
由于您的HTML页面是正确的,因此似乎您正在数据库中存储正确的数据。
€
是欧元标志的UTF-8编码被误解为Windows-1252。看来您的Windows工具使用“ ANSI”编码而不是数据库编码。