Mysqli Update UTF8


Mysqli Update UTF8

所以,当我更新数据库中的内容时,它会将例如this:Š变成this:u0160,如果它变成this:'u0160,它会正确显示,但不会。

这是我的连接文件:

<?php
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', 'pwd');
define('DB_DATABASE', 'database');
$db = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
mysqli_set_charset($db,"utf8");
mysqli_query("set names utf8");
?>

这就是查询:

mysqli_query($db, "UPDATE schools SET subjectData='$json' WHERE id='$schoolID'");
  • $json的值:{"subject":"A","desc":"A'u017d"}
  • 数据库条目的值:{"subject":"A","desc":"Au017d"}

这与UTF-8完全无关,您只处理纯ASCII值。您的问题是,当您将反斜杠输入数据库时,反斜杠(JSON编码的必要部分)正在消失。原因可能是您没有正确地转义数据。反斜杠在SQL中有一个特殊的转义含义,如果您想在数据库中插入一个字面反斜杠,它需要转义。对于mysqli,您应该使用准备好的语句:

$stmt = $db->prepare('UPDATE schools SET subjectData = ? WHERE id = ?');
$stmt->bind_param('ss', $json, $schoolID);
$stmt->execute();

请参阅如何防止PHP中的SQL注入?和伟大的逃避主义(或者:在文本中处理文本需要知道什么)。

所以您显示了变量值,但没有显示从数据库中提取值的代码。

另一个注意事项是:你的值并不是真正的utf8,它是json编码的字符串:

{"subject":"A","desc":"A'u017d"}

正如您所看到的,原始字符串不等于存储在数据库中的值:

{"subject":"A","desc":"Au017d"}

在数据库中保存原始json并不是最好的做法。我建议只保存值而不保存对象。

但如果你需要这个,你应该在插入和/或更新记录时使用这个:

mysqli_query($db, "UPDATE schools SET subjectData='".mysqli_escape_string($json)."' WHERE id='$schoolID'");