2009-10-23 67 views
1

有人可以解釋我如何將轉義字符串存儲在mysql表大小限制的列中。我的意思是,如果我有一個我定義大小的列(比如varchar(10)),如果我插入「abcdefghij」達到了限制,但是如果我插入「abcde'ghij」,我超出了限制最後一個字符串的結果是「abcde \'ghij」,儘管原始大小是10!如何控制這個?mysql轉義字符串存儲

+5

我懷疑你是雙逃脫。我從來沒有遇到過這個問題。 –

回答

0

你要麼必須分配兩倍的空間值(假設有一個潛在的每一個字符需要轉義),或通過發射它的時候,不存儲時,它逃脫文本裙子的問題。

(缺點到第二個,當你寫作往往比你正在閱讀的是;但好處是,你可以處理有逃避的東西不同,這取決於如何或在哪裏它顯示的)。

更新:我知道,MySQL不會存儲用於插入額外的字符,但它也將在不使用\'一個轉義的單引號 - 所以我只能假設,逃逸是什麼正在消耗或以其他方式利用它們正在存儲的值。 (例如,我見過人們存儲'",因爲這些值正在HTML中使用......如果有數據被用於非HTML目的的機會,我寧願採取命中和編碼發射。)

+3

如果使用正確,則轉義字符不會存儲在數據庫中。它只在將數據傳遞給mysql時使用。 –

1

ANSI SQL轉義字符是',但是如果NO_BACKSLASH_ESCAPES未啓用,MySQL也允許\轉義。

轉義字符實際上並不佔用一個字符。只有這樣解析器才能正確讀取輸入。

例如,將「1234567890」或「12345678''0」都將佔用的空間等於金額並不會溢出約束的領域。

MySQL manual有一個相當完整的章節。

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 
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.

3

圍繞字符串轉義以及轉義字符的工作方式常常存在很多混淆。例如,給定此PHP代碼:

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

可變$string不包含任何斜線。我在那裏寫的代碼有一些斜槓,但它們只是爲解析器的好處而存在,告訴它下面的引號不應該結束字符串。

這同樣適用於數據庫,但這是很多人絆倒的地方,因爲你經常建立一個由2個解析器讀取的字符串,首先是你的編程語言(例如:PHP),然後是數據庫。例如,要插入字符串""(雙引號,不是一個空字符串)到數據庫,你需要一些代碼,看起來像這樣:

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

PHP讀取此,並解釋字符串是這個:

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

然後MySQL的讀取並解釋插入值:

"" 

(雙引號)

現在,這是全部排序,手頭的問題呢?你說你有一個逃脫的字符串?這是一個問題。 您應該只在最後時刻根據需要轉義字符串。如果你想存儲的數據爲5 o'clock,則該字符串的值應爲5 o'clock5 o\'clock

當您插入該值到一個SQL語句,那一刻,當你需要進行轉義。

$myString = '5 o\'clock'; // value is: 5 o'clock 
$sql = sprintf(
    "INSERT INTO myTable VALUES ('%s')", 
    mysql_real_escape_string($myString) // 5 o\'clock 
); 
echo $sql; // INSERT INTO myTable VALUES ('5 o\'clock');