如何强制 mySQL 数据库存储这个特殊字符:╠?

Posted

技术标签:

【中文标题】如何强制 mySQL 数据库存储这个特殊字符:╠?【英文标题】:How can I force mySQL database to store this special character: ╠? 【发布时间】:2017-12-27 08:11:56 【问题描述】:

我正在使用 php 将此变量插入到 mysql 数据库中:

$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 数据库存储这个特殊字符:╠?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 有几个特殊字符的函数

如何在mysql的json列中存储特殊字符

避免mysql注入应该避免都有哪些特殊字符

异常:存储MYSQL转义数据保证数据存储的准确性...

mysql 存储过程,如何把一个 字符串变成一个 整形数 比如 “33” 变成整数的33

UTF-8 中的特殊字符在 MYSQL 中使用 magento 存储为带问号的菱形