mysql数据库中的特殊字符

我有一个mysql数据库,里面有问题和答案,这些问题和答案用HTML段落和按钮显示。q&a中包含了很多特殊字符,比如é,…,’,”,ö,还有一些html标签,比如sup。

我试过mysqli_real_escape_string,htmlentities和添加反斜线,但有些字符总是在页面上显示不正确。有时在段落中是正确的,但在按钮上却不正确。

正确的函数是什么,以使所有这些特殊字符正确显示,以及我应该在什么时候使用它(当插入到数据库或从数据库中选择它到HTML?

谢谢

解决方案:

字符集和整理

正如其他人所说,你的问题之一可能是字符集和整理。 你需要确保整个链条(输入、存储和输出)的配置正确,以处理你正在使用的字符。 UTF-8 通常是一个不错的选择,因为它可以处理Unicode字符集中的每一个字符。

要使用不区分大小写的UTF-8创建一个MySQL数据库或表。

CREATE DATABASE mydb
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

CREATE TABLE mytable ( ... )
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

逃逸

mysql_real_escape_string (我假设你使用的是PHP)用于帮助MySQL解析器区分你的参数和SQL关键字。 当整个SQL命令作为单个字符串提供时,就会使用它。

INSERT INTO mytable VALUES ("this \" is a double quote");

反斜线是为了帮助MySQL理解字符串中间的双引号实际上是字符串中间的双引号,而不是收尾的双引号。

通过在将数据插入数据库之前对数据进行转义,你直接改变了这些数据:你不再存储原始数据,因此,当你从数据库中检索数据时,必须再次对其进行处理(解除转义)。

预备语句

为了让事情更简单,对你和Mysql来说,你可以使用 编制的报表 来代替。 预备语句使用占位符向MySQL确切地显示SQL语句的哪些部分是你的参数。

$stmt = $dbh->prepare("INSERT INTO mytable VALUES (?)");
$stmt->execute(array('this " is a double quote'));

通过使用准备好的语句,你可以不加修改地将数据插入到数据库中–不需要进行混乱的转义。 这样做还有一个好处,就是可以大大降低SQL注入的可能性。 请看 比尔-卡尔文 Sql注入的误区和谬误 说话幻灯片 以获取更多关于此主题的信息。

产量

现在,您的数据以其原始格式存储,您可以按照自己的意愿自由输出。 如果你输出的是HTML(以HTML字面形式显示),那么你需要在输出前对其进行转义。 有很多方法可以做到这一点,包括 htmlspecialcharsHTML净化器. 你选择哪种方法取决于你的数据来源,以及你到底想让它如何显示。

给TA打赏
共{{data.count}}人
人已打赏
解决方案

Angular 8 - 当点击菜单栏上href中提到的路由路径时,路由不工作。

2022-4-22 2:00:14

解决方案

用HTML5实现Selenium Java拖拽功能

2022-4-22 2:00:16

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索