我正在使用 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
最佳答案
代替
$db = new PDO("mysql:host=".DBHOST.";port=8889;dbname=".DBNAME, DBUSER, DBPASS);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db -> exec("设置名称 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 源代码中继承了这种脑损伤)
关于php - 如何强制 mySQL 数据库存储这个特殊字符 : ╠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45234884/