所以,当我更新我的数据库中的内容时,它会转为:Š
这样:u0160
如果变成这样:\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"}
答案 0 :(得分:4)
这与UTF-8完全没有关系,你只处理纯ASCII值。您的问题是,当您将数据库中的反斜杠作为JSON编码的必要部分时,它会消失。原因是您没有正确转发数据。反斜杠在SQL中具有特殊的转义意义,如果要将数字反斜杠插入数据库,则需要转义。使用mysqli,您应该使用预准备语句:
$stmt = $db->prepare('UPDATE schools SET subjectData = ? WHERE id = ?');
$stmt->bind_param('ss', $json, $schoolID);
$stmt->execute();
请参阅How can I prevent SQL injection in PHP?和The Great Escapism (Or: What You Need To Know To Work With Text Within Text)。
答案 1 :(得分:1)
所以你展示了变量值,但是你没有显示从数据库中提取值的代码。
另一个注意事项:你的价值不是真的是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'");