数据库中存放特殊字符问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库中存放特殊字符问题相关的知识,希望对你有一定的参考价值。

使用myqsql5,存放㎡,之类的数学符号,就成了乱码,但若是直接复制的方式保存在数据库中时就没有乱码,请问如何解决?
字段类型是varchar(10), 因为字段里还会有中文,所以在每次执行时,都是“set names gb2312”后,再执行insert into。这时,㎡就是乱码了。

数据类型改为 nvarchar(10),也就是以unicode方式存储,即可。追问

mysql没有nvarchar类型的。

追答

哦,我说的是sql server,如果是mysql你要自己查一下了,反正就是要让它支持uniocde存储。

追问

是啊,主流的DB都是有nvarchar类型,但mysql就没有。但varchar也是支持unicode的

参考技术A 数据表格创建时是使用UTF-8的方式编码么,检查下这个。
SHOW CREATE TABLE tablename; #查看表格创建时所使用的编码方式
参考技术B 转成Nvarchar试试,就是Unicode格式追问

mysql没有nvarchar类型的。

参考技术C 存进来的时候,类型和数据库字段类型一致么?

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。

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

sql中如何判断字符串中含有特殊字符

如何解析iOS中具有特殊字符的xml数据?

如何向SQL中插入含@、#等特殊字符的字符串

如何用sql向数据库中插入包含特殊字符的字

json特殊字符都有哪些

加密没有特殊字符的数据(“=”)