【问题标题】:charset in mysql json [duplicate]mysql json中的字符集[重复]
【发布时间】:2026-01-27 11:35:01
【问题描述】:

我有这个 php 脚本来获取值

<?php
header("Content-type: application/json; charset=utf8_general_ci");
require_once('db.php');
$query = 'SELECT * FROM `hebreux`';
$stm = $db->prepare($query);
$stm->execute();
$rows = $stm->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows);

当我运行脚本时,我的值如下

[{"francais":"Bonjour","hebreux":"???","chemin":""},{"francais":"Bonne semaine","hebreux":"? ??? ???","chemin":""}]

我的问题是为什么我有??? 而不是希伯来文文本? 在我的 mysql 数据库中,我显示了我拥有的希伯来语值 charset utf8_general_ci 作为希伯来语值。

如果你能帮助我,谢谢。

【问题讨论】:

  • charset=utf8_general_ci 不是 HTTP 上下文中的东西。
  • 那我该怎么办,谢谢
  • 参见*.com/questions/38363566/… 中的“问号”。注意:问号是在INSERT 期间创建的,希伯来文本丢失了。

标签: php mysql json character-encoding


【解决方案1】:

你应该调整两个边 通过设置连接字符集在代码中的一侧 通过在与您的数据库连接后执行这些查询

header("Content-type:application/json;charset=utf8_general_ci");
require_once('db.php');
$sql = 'SET NAMES "UTF8"';
$stm = $db->prepare($sql);
$stm->execute();
$sql = 'SET CHARACTER SET utf8' ;
$stm = $db->prepare($sql);
$stm->execute()
$sql = "SET COLLATION_CONNECTION = 'utf8_unicode_ci'" ;
$stm = $db->prepare($sql) ;
$stm->execute()
 

$query = 'SELECT * FROM `hebreux`';
$stm = $db->prepare($query);
$stm->execute();
$rows = $stm->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($rows);

然后使用任何程序(如 Notepad++)打开您编写代码的文件,该程序允许您调整文件编码,然后将所有文件更改为 UTF-8-BOM

您可以通过任何方式调整数据库,例如 如果您使用 PHP ≥ 5.3.6 的 PDO 抽象层,您可以在 DSN 中指定字符集:

$dbh = new PDO('mysql:charset=utf8mb4');

如果你使用mysqli,你可以调用set_charset():

$mysqli->set_charset('utf8mb4');       // object oriented style
mysqli_set_charset($link, 'utf8mb4');  // procedural style

如果你坚持使用普通的 mysql,但碰巧运行的是 PHP ≥ 5.2.3,你可以调用 mysql_set_charset。

如果驱动程序没有提供自己的设置连接字符集的机制,您可能必须发出一个查询来告诉 MySQL 您的应用程序希望如何对连接上的数据进行编码:SET NAMES 'utf8mb4'。

【讨论】:

  • 您好,谢谢您的帮助,是否可以将所有脚本与我的脚本一起提供,谢谢
  • 我更新了我的答案,试试看,但你需要用记事本++更新文件的编码
  • 非常感谢您的帮助,祝阿克拉姆有美好的一天
  • 不客气,卡尔
  • 这不是您设置连接字符集的方式。请不要散布虚假信息。