如何强制 mySQL 数据库存储这个特殊字符:╠?
Posted
技术标签:
【中文标题】如何强制 mySQL 数据库存储这个特殊字符:╠?【英文标题】:How can I force mySQL database to store this special character: ╠? 【发布时间】:2017-12-27 08:11:56 【问题描述】:$name="Ele ╠phant";
$db = new PDO("mysql:host=".DBHOST.";port=8889;dbname=".DBNAME, DBUSER, DBPASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db -> exec("set names utf8");
$sql = "INSERT INTO data (name) values(?) ";
$q = $pdo->prepare($sql);
$q->execute(array($name));
我希望它完全像这样 (Ele ╠phant
) 存储在数据库中。
但是通过 phpMyadmin 我看到它不是这样存储的:
Ele?phant
我的排序规则是utf8_general_ci
。
我测试了另一种方法:
$db = new PDO("mysql:host=".DBHOST.";port=8889;dbname=".DBNAME, DBUSER, DBPASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db -> exec("set names utf8mb4");
$sql = "INSERT INTO data (name) values(?) ";
$q = $pdo->prepare($sql);
$q->execute(array($name));
在 phpMyadmin 中,我将排序规则设置为 utf8mb4_general_ci
,但它仍然存储 Ele?phant
【问题讨论】:
您确定代码正在存储Ele?phant
???当您将连接存储在$db
上时,您正在使用$pdo
作为连接资源!注意你的连接,否则 utf8_general_ci 应该与 ╠
这个字符一起使用
把sql语句前后的双引号换成单引号再试一次。
【参考方案1】:
而不是
$db = new PDO("mysql:host=".DBHOST.";port=8889;dbname=".DBNAME, DBUSER, DBPASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db -> exec("set names utf8");
执行以下 1 行:
$db = new PDO("mysql:host=".DBHOST.";port=8889;dbname=".DBNAME.';charset=utf8mb4', DBUSER, DBPASS,array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
另请注意我如何将其从 utf8
更改为 utf8mb4
。
quote My collation is utf8_general_ci.
- 最好的猜测,这就是你的问题(以及错误的连接字符集)。看,mysql 的utf8
不是真正的utf8,而是一个延迟命名的子集,而真正的utf8 在MySQL 中被命名为utf8mb4
。可能不支持╠
字符的子集。一直运行utf8mb4
/ utf8mb4_unicode_ci
,你应该不会遇到这个问题。此外,如果将来您希望 MySQL 在无法插入数据时抛出错误而不是损坏您的数据,请启用 STRICT_ALL_TABLES sql_mode。 (然后你会得到一个异常,而不是 mysql 存储你的字符串的损坏版本)
(对于 MariaDB 也是如此,它从 MySQL 源代码中继承了这种脑损伤)
【讨论】:
谢谢,我现在就测试一下。run utf8mb4 / utf8mb4_unicode_ci all the way through
是什么意思
@Jarla 我的意思是,当您连接时,明确使用 utf8mb4
字符集,当您为文本类型选择排序规则时,请始终使用 utf8mb4_unicode_ci
- 当您提供 html 时,请指定 @ http 标头中的 987654335@
我将排序规则更改为utf8mb4_unicode_ci
,并按照您的建议更改了我的数据库连接。但它仍然被存储Ele?phant
只是无法让它工作:'-(
@Jarla 现在这很奇怪。这段代码给了你什么? pastebin.com/qfrJmF4w
你的代码结果是:array(1) [0]=> array(1) ["input"]=> string(13) "Ele ╠ phant"
以上是关于如何强制 mySQL 数据库存储这个特殊字符:╠?的主要内容,如果未能解决你的问题,请参考以下文章