簡體   English   中英

從批處理腳本轉義MYSQL插入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM