mysql数据库中的特殊字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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净化器. 你选择哪种方法取决于你的数据来源,以及你到底想让它如何显示。

另一答案

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

另一答案

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

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

以上是关于mysql数据库中的特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

PHP / MySQL中的PDO和UTF-8特殊字符?

mysql数据库中的特殊字符

如何转义mysql jdbc连接字符串中的特殊字符

如何在mysql数据库中鎒moji特殊字符

UTF-8 中的特殊字符在 MYSQL 中使用 magento 存储为带问号的菱形

mysql 有几个特殊字符的函数