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

时间:2017-07-21 10:06:51

标签: php mysql pdo phpmyadmin special-characters

我使用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

1 个答案:

答案 0 :(得分:2)

而不是

$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

引用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源代码的脑损伤)