2013-12-20 46 views
1

我在MySQL DB中有一列VARCHAR(1000)。 因此,當PHP請求插入超過1000個符號時,文本的其餘部分將被拒絕。如何在MySQL列類型varchar(1000)中正確寫入文本?

在現場我已經把一個textareamaxlength=1000, 但在服務器端,PHP解析提交與htmlspecialchars功能文本,所以如果文字是it's called "nothing",它成爲it's called "nothing"

問題是文本可能會變得超過1000個符號,即使它顯然輸入了1000個字符。

你能幫我找到正確的方法,正確的功能等插入所有用戶輸入的字符?

+2

使用類型文本而不是varchar –

+0

使用VARCHAR而不是TEXT的任何原因? – kba

+0

不知道,但它看起來像VARCHAR類型比TEXT更快速 – user3123736

回答

9

存儲在數據庫中時不要使用htmlspecialchars。從數據庫中檢索並寫入瀏覽器時使用它(或htmlentities)。

+0

每次調用函數(如htmlentities)時,這不會是矯枉過正的,而不是寫入數據庫的正確文本,然後從數據庫中檢索沒有過多的功能? – user3123736

+1

它使數據庫更通用。沒有理由認爲數據只用於在網頁上顯示,您可能有其他應用程序將其放入CSV等。您應該使用適合上下文的功能,並且只能在創建HTML功能時使用HTML。 – Barmar

+0

我看到...如果文本沒有正確轉義,那麼在保存數據庫中的文本時遇到的錯誤如何?我只是一個初學者,所以我只是問嘿嘿 –

0

您還必須注意UTF-8的字符佔用空間大於每個字節的空間。

VARCHAR背後的想法(例如通過CHAR)是,它允許數據庫在未完全使用字段時將較少的字節存儲到磁盤。例如,如果將「xx」寫入VARCHAR(1000),則只有兩個字符存儲到您的物理數據庫中,而不是1000.(請注意,此處我說的字符不是字節,實際字節數將是更多以允許更寬的可變寬度UTF-8代碼,所需的字符串長度,任何字和磁盤緩衝區填充等等。但顯然,與存儲CHAR相比,您將存儲的字節少得多。)

因此,讓SQL爲你做一些工作。將字段大小設置爲3000或者其他東西,或者至少足夠大以至於永遠不會有問題,即使大部分符號都比8位寬。

+0

這裏有一些不正確的信息。 MySQL中'VARCHAR'的大小是可以存儲的最大*字符數*,而不是字節數。如果列是在一個多字節字符集中聲明的,那麼MySQL可以理解多字節字符,所以絕對沒有理由使列過大。此外,沒有「填充」,只有一個或兩個字節用於存儲列中存儲的數據的長度。 –

+0

我從來沒有聲稱VARCHAR的大小是你聲稱存儲的字節數。但是它與它有關,因爲如果你不填滿你的字段,那麼你將字節保存在磁盤上。 –

+0

我推斷從「使字段大小3000或某事」......和3000 = 1000 x 3潛在字節在utf-8每個字符斷言。即使每個字符恰好是一個3字節的Unicode字符,您「絕不會有問題」在一個「VARCHAR(1000)」中存儲1000個字符。我認爲你暗示varchar的大小是以字節爲單位的大小,因爲我無法辨別提及「即使大部分符號比8位寬」的另一個原因。 –

相關問題