mysql数据库中的特殊字符

问题描述 投票:1回答:3

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

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

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

谢谢

mysql html special-characters
3个回答
3
投票

字符集和整理

正如其他人所说,你的问题之一可能是字符集和整理。 你需要确保整个链条(输入、存储和输出)的配置正确,以处理你正在使用的字符。 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净化器. 你选择哪种方法取决于你的数据来源,以及你到底想让它如何显示。


0
投票

如果你确保你的数据库编码和页面编码都是UTF-8,那么这应该对你的工作有很大帮助。


0
投票

我怀疑问题出在使用的字符集上。 你的mysql整理需要支持你试图使用的字符,而你的网页需要在一个匹配的字符集。

最有可能的是,你的MySQL数据库使用的是latin1_general_ci这样的整理方式,而你的网页应该是以UTF-8显示的。 我建议你将MySQL设置为以UTF-8存储数据,而你的网页应该输出一个头,说明它们是UTF-8。

© www.soinside.com 2019 - 2024. All rights reserved.