mysql转义字符串存储

时间:2009-10-23 13:36:07

标签: sql mysql

有人可以解释一下如何将转义字符串存储在mysql表大小有限的列中。我的意思是,如果我有一个我定义一个大小的列(让我们说varchar(10)),如果我插入“abcdefghij”达到限制,但是如果我插入“abcde'ghij”我超过限制,因为转义最后一个字符串的结果是“abcde \'ghij”,虽然原始大小是10!如何控制?

5 个答案:

答案 0 :(得分:3)

关于字符串转义以及转义字符如何工作,通常会有很多混淆。例如,给定这个PHP代码:

$string = "My \"string\" is cool.";

变量$string 不包含任何斜杠。我在那里写的代码中有一些斜杠,但它们只是为了解析器的利益而存在,告诉它下面的引号不应该结束字符串。

这同样适用于数据库,但这是许多人绊倒的地方,因为你经常构建一个由2个解析器读取的字符串,首先是你的编程语言(例如:PHP),然后是数据库。例如,要将字符串""(两个引号,而不是空字符串)插入数据库,您需要一些看起来像这样的代码:

$sql = "INSERT INTO myTable VALUES (\"\\\"\\\"\")";

PHP读取此内容并将字符串解释为:

INSERT INTO myTable VALUES ("\"\"")

然后MySQL读取并将插入值解释为:

""

(两个引号)

现在已全部排序,手头的问题怎么样?你说你有逃脱的字符串?那是个问题。 您应该只在最后一刻根据需要转义字符串。如果要存储的数据是5 o'clock,则字符串的值应为{{1} }, 5 o'clock

当您将该值插入SQL语句时,就是您需要将其转义的时刻。

5 o\'clock

答案 1 :(得分:1)

ANSI SQL转义字符为',但如果\未启用,MySQL也允许NO_BACKSLASH_ESCAPES转义。

转义char实际上不会再占用一个char。只有这样解析器才能正确读取输入。

例如,插入'1234567890'或'12345678''0'将占用相等的空间量,并且不会溢出字段限制。

MySQL manual有一个非常完整的章节。

答案 2 :(得分:1)

存储的值不应包含反斜杠。你正以某种方式逃避你的数据两次,正如评论所述(上图)。

非常简单的伪代码,关于进程应该如何:

data = "Let's party!"
data = escape(data) # Let\'s party
save(data)
## The database ignores the single quote, since it is escaped with a backslash
## but then removes the slash before storing data

read(data) # Let's party

答案 3 :(得分:0)

你要么必须为值分配两倍的空间(假设每个角色都有可能需要进行转义),或者在发出文本时转义文本,而不是在存储文本时转移问题。

(第二个问题的缺点在于你的写作时间比你正在阅读时更频繁;但优点是你可以根据显示的方式或位置来处理不同的事情。)

update :我知道mysql不会存储用于插入的额外字符,但在插入时也不会使用\'作为转义单引号 - 所以我可以只假设转义是为了消费或以其他方式利用它们存储的值。 (例如,我见过人们存储'",因为这些值正在HTML中使用...如果有可能数据存在,我宁愿接受命中和编码用于非HTML目的。)

答案 4 :(得分:0)

在放置数据进行存储而不使用准备好的查询时,您需要将数据完全转义一次,如上所示。

对查询的字符串文字部分使用准备好的查询时,不应该转义数据,这样做会导致您的问题。

$db = new mysqli('localhost', 'my_user', 'my_password', 'world');
$sql = 'INSERT INTO `blah` (field1,field2) VALUES (?,?)';
$query = $db->prepare($sql);
$query->bind_parms('ss',$no_escaping,$needed_here);
$query->execute();

编辑:您使用的是准备好的查询吗?

如果你是的话,我已经为这个here.拼凑了一个课程。