【发布时间】:2019-03-19 03:38:05
【问题描述】:
我知道这已经被问过很多次了,我几乎尝试了所有这些,但它得到了不同的结果,所以请继续阅读!不要投反对票!正如我所说,我已经尝试了大多数解决方案!
我使用utf8mb4作为编码,character_set_connection和character_set_database已经设置为utf8mb4。我网页中的字符集设置为 utf8。我使用过 PDO,当我打开与数据库的连接时,我使用 utf8mb4 作为字符集。表中的列也有 utf8mb4_unicode_ci 作为排序规则。使用的存储引擎是 MyISAM。
出现差异是因为我无法编辑 character_set_server(因为我在共享主机上),它默认设置为 utf8,而 collation_server 默认设置为 utf8_unicode_ui。我无法以任何方式改变这些。它在具有相似字符变量的 localhost 上运行良好。
编辑:
连接变量是 $conn,打开为$db_server = 'localhost';
$db_name = 'userdb';
$db_encoding = 'utf8mb4';
$db_user = 'test';
$db_pass = 'password';
$conn = new PDO('mysql:host='.$db_server.';dbname='.$db_name.';charset='.$db_encoding,$db_user,$db_pass);
获取输入的表单很简单<form action="" method="POST" accept-charset="UTF-8"><input type="text" class="form-control" name="inp"></form>
并且输入被处理为$test = $_POST['inp'];
$it = $conn->prepare("INSERT INTO tbl_test(message) VALUES(?)");
$it->bindParam(1,$test,PDO::PARAM_STR);
if($it->execute()) echo $test;
else echo 'Error!';
所以问题是:
1. 为什么我尽可能使用了utf8mb4和utf8mb4_unicode_ci,还是出现这个问题?
2.这可能是 php 问题而不是 MySQL 问题,因为问题发生在数据库中的 INSERTION 期间(我对字符串使用了 stripslashes()、trim() 和 htmlspecialchars() 函数)?
3.有趣的是,表情符号(unicode 字符)在网站的一个页面上运行良好,即聊天页面。会不会是加密的原因?似乎没有可能的解释!
在回答之前请记住,我已经尝试了几乎所有关于 SO 的解决方案,并且由于我在共享主机上,我无法编辑 MySQL 配置文件。 请回答,我卡在这个问题上超过 3 天了!
【问题讨论】:
-
您应该将问题文本块更改为列表。虽然听起来您采取了所有正确的步骤(排序与字符集/编码无关紧要),但如果没有一些输入的十六进制转储、存储值的十六进制转储、使用 mysql CLI 客户端等检查、数据库插入代码,这是无法回答的样品等。或者使用 SQLite 进行测试以验证它是否真的是数据库,而不是您的表单处理。另见:UTF-8 all the way through
-
@mario 我已经解决了这个问题,似乎我已经完成了这些步骤。
-
“我使用了 stripslashes()、trim() 和 htmlspecialchars() 函数” → 这些函数都与您的问题无关,也没有任何好处。您是否有特殊原因不会详细介绍(代码/数据示例)?您希望哪些随机建议尚未包含在“几乎所有 SO 解决方案”中?
-
VTC:寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及重现它所需的最短代码 在问题本身中。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example。
-
编辑了@mario,虽然代码没有什么特别之处,是的,有时会出现斜杠和魔术引号!
标签: php mysql unicode utf-8 utf8mb4