[英]Escape MYSQL Insert from batch script
MYSQL是否有臨時轉義機制?
我正在運行一些腳本並將值插入MYSQL數據庫。 當監視腳本時,一切似乎都正常,打印輸出顯示一切正常,但是當檢查數據庫時,某些值會以一種怪異的方式插入,有些字母被替換為控制字符或空格(我正在做set basename=!var:~7!
以獲取插入當前問題的值)。
具體而言,小寫字母b替換為BS char,小寫字母r替換為小寫。
由於腳本是Windows批處理文件,所以我想知道是否可以通過查詢強制轉義這些字符(例如PHP中的mysql_real_escape_string,而直接在MYSQL中)或設置一些選項服務器端,以便數據庫處理這些情況。
有任何想法嗎?
給定輸入流中的反斜杠字符,您所描述的是我們期望的結果。
其中'\\b'
出現在字符串文字中,將被解釋為退格字符。
如果'\\r'
出現在字符串文字中,則將其解釋為回車符。
為了避免對這些(和其他類似的)特殊“轉義序列”字符的解釋,規范模式是在反斜杠字符之前加上另一個反斜杠。
在字符串文字中出現'\\\\'
地方,它將被解釋為單個反斜杠字符。
因此,為回答您的問題...是的,MySQL具有內置的特殊字符“轉義序列”。 聽起來像您遇到的問題; 您的某些反斜杠字符將被解釋為“轉義序列”。
而且,不,在mysql命令行客戶端中沒有執行mysql_real_escape_string
類型功能的選項。 命令行客戶端在接收到字符串時將字符串傳遞給服務器。
但是可以將會話的sql_mode
設置為包含NO_BACKSLASH_ESCAPES
選項。 這會禁止將反斜杠字符解釋為特殊轉義序列的開始,並且反斜杠字符將被解釋為文字反斜杠字符。
要查詢會話的當前sql_mode
:
SELECT @@SESSION.sql_mode ;
設置當前的sql_mode
,例如
SET SESSION sql_mode = 'NO_BACKSLASH_ESCAPES'
注意:SET語句將覆蓋當前的sql_mode
,而不僅僅是更改一個設置。 因此,如果已將其設置為非空白值,則可能只想添加到現有的sql_mode,例如
如果當前sql_mode設置為'ALLOW_INVALID_DATES,ANSI_QUOTES'
,則只想將該選項添加到當前設置,例如
SET SESSION sql_mode = 'ALLOW_INVALID_DATES,ANSI_QUOTES,NO_BACKSLASH_ESCAPES'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.