MySQL PHP 转义字符串'/'--为什么它没有和反斜杠一起保存在数据库中?

问题描述 投票:6回答:5

困惑于转义字符串和它是如何保存在数据库中的。

在我的MySQL调用中,我用反斜杠转义了一个字符串。

UPDATE `TABLE` SET `PERSONAL_BELONGINGS` = 'Tom\'s things'

但是当我在phpadmin中查看时 - 这个值是这样保存的:

|Tom's things|

为什么反斜线没有被保存到数据库中呢? 当我把这个值读到javascript中,然后试着把它传给别人时,就会出现问题 - 我的javascript字符串会终止. 这就是为什么我一开始就对这个字符进行了转义。

为什么MySQL在将其保存到数据库之前要删除'\'反斜杠?

如果不把它和'\'一起保存在数据库中,那么当你把它作为一个字符串传回javascript时,最好的处理方法是什么?当把它作为字符串传给javascript时,如何再次转义?

php mysql escaping backslash
5个回答
8
投票

首先我要说的是,你真的不应该在数据库中以任何特定的转义格式存储数据,如果以后你需要以其他格式提取数据或者以后因为某些原因搜索数据,你会后悔的。你现在保存的格式看起来很好,为Javascript添加反斜杠最好在代码中完成,当把数据传递给实际的Javascript。

现在这就是为什么它目前的行为是这样的。

在字符串中 'Tom\'s things', \' 是一个 字符转义序列 并且实际上只是用来让MySQL了解如何解析SQL字符串,它从来没有原封不动地保存到数据库中。

转义字符的原因是 ' 在你所显示的SQL语句中,首先是,否则MySQL没有办法知道该字符串没有在后面的单引号处结束。'Tom.

如果你使用MySQLi或PDO准备好的语句,而不是自己构建你的SQL语句,MySQL会让你完全不变地保存值,而不需要转义任何东西。这绝对是首选,因为无论如何,不支持准备好的语句的MySQL API是被废弃的。


3
投票

反斜线被视为"逸字". 如果没有反斜杠,你的字符串将以""结束。Tom 但其余 s things 会导致语法错误。

句法错误。\ 告诉MySQL不处理转义的 ' 作为字符串定界符,但一直到下一个未括弧的 ' 被发现。

这个转义字符只用于查询目的,并不作为你要更新的字符串的一部分。

就像Alvin在评论中建议的那样,如果你想在数据库中保留反斜线,你必须通过添加另一个转义的反斜线来添加它,即 \\. 这将使你的查询看起来像。

UPDATE `TABLE` SET `PERSONAL_BELONGINGS` = 'Tom\\\'s things'

而数据库中的数据就会变成:

|Tom\'s things|

你可以在以下文章中阅读更多关于字符串字元和特殊字符转义的内容。MySQL手册

但值得注意的是,在数据库中存储一个已经转义的字符串是一种不好的做法。你应该在代码中注意转义特殊字符。


1
投票

因为,在MySQL中,反斜线是一个转义字符(就像在PHP中一样)。你必须转义反斜线本身才能存储它--所以。\\ 将存储一个反斜杠。\\\' 将存储一个反斜杠和一个引号,因为第一个反斜杠转过第二个,第三个转过引号。


1
投票

当我把这个值读到javascript中时,就会出现问题。

当然 这个 . 那你把钱锁在保险柜里,如果钱被抢了,你可以怪保险柜厂家。但只要你把钱拿回来了,钱被偷了--你就不能还怪保险柜了。它是 你的 责任了。

所以,如果你需要对javascript的数据进行转义--只需转义即可。但当然不是通过使用 mysql_escape_string()


0
投票

尝试使用这个。

 Function EscapeBack(ByVal msData As Object) As String
        Return (Replace(msData, "\", "\\"))
    End Function

使用这个。

EscapeQuote(filename.Text)

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