我需要將特殊字符和符號存儲到mysql數據庫中。因此,無論是我可以將它存儲爲'ü'還是將其轉換爲html代碼,如'& uuml;'在數據庫中存儲數據時是否需要使用HTML實體?
我不確定哪個會更好。
另外我有象'♥','''的符號。
請建議哪一個更好?還建議是否有其他方法。
謝謝。
我需要將特殊字符和符號存儲到mysql數據庫中。因此,無論是我可以將它存儲爲'ü'還是將其轉換爲html代碼,如'& uuml;'在數據庫中存儲數據時是否需要使用HTML實體?
我不確定哪個會更好。
另外我有象'♥','''的符號。
請建議哪一個更好?還建議是否有其他方法。
謝謝。
多年前引入了HTML實體,當運輸不是二進制安全的並且用戶代理(瀏覽器)不支持傳輸層或服務器的字符集編碼時,通過網絡傳輸字符信息。
爲HTML實體只含有非常基本的字符(&
,;
,a-z
和0-9
)和這些字符在大多數字符集相同的二進制編碼,這是和來自那些副作用非常安全。
但是,當您在數據庫中存儲某些內容時,您並沒有這些問題,因爲您通常處於控制之下,並且知道如何將文本存儲到數據庫中。
例如,如果允許數據庫中的文本使用Unicode,則可以存儲所有字符,其中沒有一個是特殊的。請注意,您需要在此處瞭解您的數據庫,您可以運行一些技術細節。就像你不知道數據庫連接的charset編碼一樣,你不能準確地告訴你的數據庫你想在那裏存儲哪些文本。但通常情況下,您只需存儲文本並在稍後檢索。沒有什麼特別的處理。
ü
是LATIN-1比ü
大得多,UTF-8,UTF-16 事實上,當您使用HTML實體,而不是簡單的人物也有缺點或UTF-32。
當你混合兩個概念時,真正的樂趣開始了。你來到了一個你不想去的地方。所以不要這樣做,因爲你不需要它。
這是5歲,但我想證明在最後一段提到的「真正的樂趣」。我們有一個MySql數據庫,這個數據庫有大量的表,其中包含'latin1'字段和'utf-8'歸類字段。我們在數據庫中同時存儲了特殊字符(主要是註冊商標和商標)和html實體(在某些情況下存儲了雙重編碼的html實體,即'& reg;')。男孩和女孩,不要走這條路。當涉及到如何在數據庫中存儲字符並堅持使用時,做出明智的決定。當你拉出數據時,那麼你可以根據需要修改它。 – DerProgrammer 2017-05-02 20:35:00
將您的數據保留在數據庫中。除非您需要HTML,否則不要使用HTML實體。你永遠不知道什麼時候你可能想在其他地方使用你的數據,而不是在網頁上。
+1,但輸出HTML時不需要'htmlentities' - 'htmlspecialchars()'可以防止XSS。在正確配置的環境中,'htmlentities'應該永遠不會被需要 – 2012-02-15 18:36:58
@Pekka,我不是在暗示使用函數,而是指實體本身。是的,'htmlspecialchars()'是實際輸出數據的首選方法。 – Brad 2012-02-15 18:38:17
我的建議會反映其他貢獻者,在將它們保存到數據庫時不會轉換特殊實體。
抗轉換的一些原因:
ü
,將爲[word]+ü+[/word]
,並且您需要對ü
=>[word]+ü+[/word]
的html等效項進行字符串比較。
我冒昧地改變了你的頭銜 - 你的頭銜很好,但是這樣一來,找到未來類似的問題更容易。 (我剛剛搜索並意識到有沒有很容易找到這個重複。) – 2012-02-15 18:37:59
這取決於該列使用的字符集存儲HTML的地方。通常你應該使用一個覆蓋所有字符的字符集(所以沒有什麼是「特殊的」),你的數據可以以規範化的形式存儲,並且在數據庫中的每個文本字段都包含的字符集編碼旁邊不包含任何特殊的編碼無論如何。 – hakre 2012-02-15 18:42:00
@皮卡這很好。如果這樣對其他人有幫助,我必須感謝你。 – 2012-02-15 18:44:58