我使用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
答案 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源代码的脑损伤)