7

对转义字符串及其在数据库中的存储方式感到困惑

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

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

但是当我查看 phpadmin - 值是这样保存的:

|Tom's things|

为什么反斜杠没有保存到数据库中?当我将此值读入 javascript 然后尝试传递它时,这会导致问题 - 我的 javascript 字符串将终止。这就是为什么我一开始就逃脱了这个角色。

为什么 MySQL 在将“\”反斜杠保存到数据库之前会删除它?

如果不使用 '\' 将其保存在数据库中 - 当您将其作为字符串传递回 javascript 时,最好的处理方法是什么?当作为字符串传递给javascript时再次转义它?

4

5 回答 5

7

首先让我说你真的不应该在数据库中以任何特定的转义格式存储数据,如果你以后需要以另一种格式提取它或稍后出于某种原因搜索数据,你会后悔的。您现在保存的格式看起来不错,在将数据传递给实际 Javascript 时,最好在代码中为 Javascript 添加反斜杠。

现在这就是为什么它目前表现得像现在这样;

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

您在开始显示的 SQL 语句中转义字符的原因'是,否则 MySQL 无法知道字符串不会在'Tom.

如果您使用 MySQLi 或 PDO 准备语句而不是自己构建 SQL 语句,MySQL 将允许您保存完全不变的值,而无需转义任何内容。这绝对是首选选项,因为不支持预准备语句的 MySQL API 无论如何都已弃用。

于 2013-02-10T08:01:55.477 回答
2

反斜杠被视为“转义字符”。如果没有反斜杠,您的字符串将以结尾,Tom但其余的s things将导致语法错误。

\告诉 MySQL 不要将转义的'字符串视为字符串分隔符,而是继续执行直到'找到下一个未转义的字符串。

此转义字符仅用于查询目的,不被视为您要更新的字符串的一部分。

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

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

数据库中的数据如下所示:

|Tom\'s things|

您可以在MySQL 手册中阅读有关字符串文字和转义特殊字符的更多信息

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

于 2013-02-10T08:00:48.787 回答
0

因为,在 MySQL 中,反斜杠是转义字符(就像在 PHP 中一样)。您必须转义反斜杠本身才能存储它——因此,\\将存储一个反斜杠。\\\'将存储一个反斜杠后跟一个引号,因为第一个反斜杠转义第二个,第三个转义引号。

于 2013-02-10T08:04:32.850 回答
0

当我将此值读入 javascript 时,这会导致问题

当然不是
然后你把钱锁在保险箱里,如果被盗了,你可以责怪保险箱制造商。
但是一旦你拿回你的钱并且它被盗了 - 你仍然不能为此责怪保险箱。
现在是的责任。

因此,如果您需要为 javascript 转义数据 - 只需将其转义即可。
但当然不是使用mysql _escape_string()

于 2013-02-10T08:12:13.373 回答
0

尝试使用这个:

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

使用这个:

EscapeQuote(filename.Text)

于 2020-05-03T07:26:43.733 回答