MySQL数据库存储特殊字符时出现问号问题

3

我想在我的网站上显示非常特殊的字符(例如 ),并将其存储到我的数据库中。当我写入这样的特殊字符时,它们会被正确显示一次,但是当我重新加载页面并从数据库获取字符串时,它们会显示为“??????? ?????? ?????? ??????”。我尝试了很多方法来解决这个问题,但都没有成功。这不是可视化问题,因为头部设置正确:

<meta charset="utf-8">

我尝试过的事情:

  • 将服务器的默认字符集设置为utf8。
  • 将数据库/表/列的排序规则和字符集设置为utf8mb4_unicode_ci。
  • 更改连接字符串为:
$db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

$db->query("SET character_set_results=utf8mb4");

mb_language('uni'); 

mb_internal_encoding('UTF-8');

$db->query("SET NAMES utf8mb4");

$db->set_charset('utf8mb4');

但是这些方法都没有起作用。另外,我尝试(仅用于调试)将数据库文本字段中的一个字符串更改为 ,然后我收到了一个错误:

警告:#1300 无效的utf8字符字符串:'F09D91'

警告:#1366 在第1行处的'text'列中的不正确字符串值:'\xF0\x9D\x91\xBB\xF0\x9D...'

我真的尝试了在这里和外面找到的每个解决方案,但是没有任何效果。任何帮助将不胜感激。

2
文件本身的编码怎么样? - Funk Forty Niner
请在 Stack 上查看以下内容 https://dev59.com/13VC5IYBdhLWcg3wfhGL/,看看是否可以使用不同的编码方法。此外,请尝试将 $db->query("SET character_set_results=utf8mb4"); 之后的所有代码放在该行之前。还可以尝试使用不同的文件编码。我自己以前也遇到过这种情况。可能是服务器的默认编码覆盖了某些东西;我以前也遇到过这个问题。 - Funk Forty Niner
以上内容的补充说明。如果您正在进行查询,例如执行SELECT、UPDATE或INSERT操作,则重要的是在查询之前放置编码代码,如果适用的话。 - Funk Forty Niner
我非常爱你。 这就解决了! 谢谢,伙计! - Simone Romano
1
当然,我一直在等它。 - Simone Romano
显示剩余4条评论
1个回答

3

如评论所讨论的那样。

在很多情况下,您需要将跟随$db->query("SET character_set_results=utf8mb4");的所有代码放在该行之前。

同时使用不同的文件编码也可能有所帮助。

我自己以前就遇到过这个问题。也可能是服务器的默认编码覆盖了一些东西。我以前也遇到过这个问题。

此外,如果您正在查询某个地方,例如执行SELECT、UPDATE或INSERT,则在查询之前放置编码代码非常重要,如果这是情况的话。


谢谢,这个解决了问题。 你救了我免受失眠和浪费时间的困扰。 - Simone Romano
@SimoneVenturas 欢迎,Simone。我深有同感,干杯 - Funk Forty Niner
在那行代码之前加上 $db->query("SET character_set_results=utf8mb4"); 。 “那行代码”是指哪一行? - VishalParkash
我有一个 Laravel 项目,需要在数据库配置文件中进行更改,并设置 'charset' => 'utf8mb4','collation' => 'utf8mb4_unicode_ci'。同时,存储特殊字符的列应该具有 'utf8_unicode_ci' 或 'utf16_unicode_ci' 的排序规则。 - akash varlani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接