【问题标题】:emojis show up as question marks after inserting into database php表情符号在插入数据库 php 后显示为问号
【发布时间】: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,而 collat​​ion_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


【解决方案1】:

在字符变量和mysql配置上浪费了很多时间之后,我用base64_encode这个简单的解决方案解决了这个问题。
通过base64_encode 传递输入字符串,然后使用base64_decode 显示它们在这种情况下有效。然而,字符串比以前占用更多空间,但这个解决方案非常简单且值得。
我刚刚发布了这个问题,以了解是否有人遇到过类似的事情,但人们真的不明白这个问题的重点。那是SO上的人们真正筋疲力尽的地方。无论如何,感谢您的帮助! :)

【讨论】:

  • 不要听这些仇恨者的声音——这正是我一直在寻找的。 Azure 根本不允许您配置他们的数据库。这是一个很好的解决方法!赞成:)
  • 如果我理解正确,数据库端你使用 utf8mb4 作为存储类型。而你使用base64encode和decode PHP端来读写数据库?
  • 所以数据库端你使用 utf8mb4 作为存储类型。并且您使用 base64encode 和解码 PHP 端来写入和读取数据库。在这里工作得很好!
  • 像魅力一样工作。感谢您的快速解决方案。
【解决方案2】:

有很多东西需要声明 utf8mb4 —— 列、连接、表单等。顺便说一句,看起来你都做了。

看看这个是什么导致“问号”:Trouble with UTF-8 characters; what I see is not what I stored

您谈到了 2 个character_set 变量,但不是需要的 3 个:

| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_results    | utf8mb4                    |

查看你的 php.ini 是否有default_charset UTF-8

不要使用任何形式的编码/解码,它只是避免解决问题。

请告诉我们echo bin2hex($text); 一些表情符号。

【讨论】:

  • 您上面提到的 3 个变量也设置为 utf8mb4。你能给出为什么通过base64让它工作的原因吗?
  • 通过 bin2hex 传递一个?得到 f09f8d94
  • 我无法查看我的 php.ini
  • @VipulSharma - base64 将其转换为一串英文字符——英文不会受到字符集问题的影响。 f09f8d94 看起来适合那个表情符号。
  • 奇怪。在这一点上,我没有看到任何问题。你能创建一个 minimal 测试用例来演示这个问题吗? (很短的 PHP 脚本,CREATE TABLE 等)在这个练习中,要么会跳出一些东西,要么会给我们一些独立实验的东西。
猜你喜欢
  • 1970-01-01
  • 2018-06-20
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
相关资源
最近更新 更多