首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL INSERT 單引號處理兩大方案:字元轉義 vs 參數化存儲過程

     編輯:MySQL 資料庫相關知識

問題場景

欄位 Title、Content 含單引號(如 O'Reilly),直接拼接 SQL 會語法錯誤:

INSERT INTO myBBS (Title, Content) VALUES ('O'Reilly', '...')  -- 語法錯誤

方案一:單引號轉義(雙單引號)

// C# 範例
string title = txtTitle.Text.Replace("'", "''");
string content = txtContent.Text.Replace("'", "''");
string sql = $"INSERT INTO myBBS (Title, Content) VALUES ('{title}', '{content}')";

✅ 簡單快速修補舊代碼
❌ 仍屬拼接 SQL,無法防禦所有注入變體、效能差(無計劃重用)

方案二:參數化存儲過程(根本解)

1. 建立存儲過程

CREATE PROCEDURE InsertMyBBSProc
    @Title CHAR(160),
    @Author CHAR(20),
    @Content NTEXT
AS
    INSERT INTO myBBS (Title, Author, Content) VALUES (@Title, @Author, @Content);

2. 測試執行

DECLARE @title CHAR(160) = 'test title',
        @author CHAR(20) = 'david',
        @content NTEXT = 'content with '' quote';
EXEC InsertMyBBSProc @title, @author, @content;

3. C# 呼叫(參數化,零拼接)

using (var conn = new SqlConnection(connStr))
using (var cmd = new SqlCommand("InsertMyBBSProc", conn) { CommandType = CommandType.StoredProcedure })
{
    cmd.Parameters.Add("@Title", SqlDbType.Char, 160).Value = txtTitle.Text;
    cmd.Parameters.Add("@Author", SqlDbType.Char, 20).Value = "David Euler";
    cmd.Parameters.Add("@Content", SqlDbType.NText).Value = txtContent.Text;

    conn.Open();
    int rows = cmd.ExecuteNonQuery();  // 回傳影響行數
}

方案對比

維度轉義法參數化存儲過程
防注入部分徹底
計劃重用否是
型別安全否是
維護性低高(邏輯在資料庫端)
適用場景舊系統快速修補新開發、核心業務

現代最佳實務:直接參數化命令(無需存儲過程)

string sql = "INSERT INTO myBBS (Title, Content) VALUES (@Title, @Content)";
using (var cmd = new SqlCommand(sql, conn))
{
    cmd.Parameters.AddWithValue("@Title", txtTitle.Text);
    cmd.Parameters.AddWithValue("@Content", txtContent.Text);
    // ...
}

結論:新專案請直接使用 參數化 SQL 命令,存儲過程保留給極高效能/邏輯封裝需求。拼接 SQL + 轉義僅為歷史包袱暫時方案。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved