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