go-mssqldb 限制

本文列出驅動程式已知的限制與限制 go-mssqldb

不支援 LastInsertID

go-mssqldb驅動程式不支援這個database/sqlResult.LastInsertId()方法。 呼叫時會回傳錯誤:

LastInsertId is not supported. Please use the OUTPUT clause or add
'select ID = convert(bigint, SCOPE_IDENTITY())' to the end of your query.

變通方法:在陳述或查詢OUTPUT中分別使用INSERT子句SCOPE_IDENTITY()

不支援多重主動結果集(MARS)

驅動程式不支援 MARS。 每個連線一次只能有一個主動查詢或語句。 如果你需要同時執行查詢,請使用與池子分開的連線。

帶有連線池的臨時表範圍

暫存資料表行為遵循 SQL Server 的範圍規則,但連線池會改變該行為在應用程式碼中的呈現方式:

  • 本地暫存資料表(#name)則被限制在一個會話(連線)上。
  • 全域暫存資料表(##name)在建立會話保持開啟期間,其他會話都能看到。

database/sql,分開 db.Execdb.Query 通話可能使用不同的池連線。 一個在一個通話中建立的本地暫存資料表,在下一個通話在不同連線上執行時,在下一個通話中看不到。

對於全域暫存資料表,跨連線的可見性運作正常,但在同時工作負載中,生命週期與命名衝突仍需注意。

指引:用於 db.Conn(ctx) 將相關操作釘選到單一連線,或在交易中包裝操作。 僅在需要跨會話可視性時使用全域暫存資料表。

關於實作模式,請參見 暫存資料表與儲存程序連線池化暫存資料表未找到

永遠加密約束

  • 有加密欄位的批量複製:驅動程式不支援對欄位始終加密的資料表進行批量複製操作。
  • 安全隔區:驅動程式不支援「始終加密」並使用安全隔區。
  • 提供者註冊:您必須匯入金鑰提供者套件(localcertakv),作為副產品匯入。 沒有它,驅動程式無法解密資料。
  • 精確參數類型匹配:加密參數必須與 SQL Server 欄位類型高度匹配。 預設的 Go string 會變成 nvarchar,但對於更特定的加密參數類型可能會失敗。
  • char加密與varchar文字:目前對加密charvarchar欄位的插入與更新有限。 當你需要「永遠加密」來處理文字資料時,建議使用加密 ncharnvarchar 欄位。

舊版 SQL Server 與 TLS

較舊且已不再支援的 SQL Server 版本可能不支援 TLS 1.2 或更新版本。 當連接這些版本時 encrypt=true,如果伺服器無法協商相容的 TLS 版本,連線可能會失敗。

變通方法:使用encrypt=false或升級到支援的 SQL Server 版本。

已棄用的 mssql 驅動程式名稱

驅動程式名稱 mssql (與 sql.Open("mssql", ...)一起使用)已被棄用。 建議改用 sqlserver

// Deprecated
db, err := sql.Open("mssql", connString)

// Recommended
db, err := sql.Open("sqlserver", connString)

mssql驅動程式名稱用於參數標記替換,將佔位符?轉換為 @p1@p2及類似的序數名稱。 sqlserver驅動程式名稱需要明確命名參數,並提供更可預測的行為。

如果你需要基於連接器 sql.OpenDB 的使用,且必須暫時保留舊有的查詢文字重寫行為,請使用 NewConnectorWithProcessQueryText。 新程式碼則偏好使用 sqlserver 驅動程式名稱和明確參數。

唯一識別欄位

驅動程式預設會以原始uniqueidentifier陣列回傳[]byte欄位值。 使用 mssql.UniqueIdentifier 掃描目的地取得標準 GUID 格式的字串。

不支援 ODBC

驅動程式純粹是 Go 實作,不使用也不依賴 unixODBC、FreeTDS 或 Microsoft ODBC 驅動程式。 ODBC 專屬功能(DSN 設定、ODBC 追蹤)無法提供。

命名管線連接

命名管線連線可能需要管線端點的特定檔案系統權限。 在 Linux 上,SMB 用戶端必須設定為命名管線存取。

浮子精度

Go float64 的類型約有 15 到 16 位有效十進位數字。 SQL Server decimal 及其numeric類型可代表最多 38 位數的精確度。 當掃描 decimal/numeric 欄位進入 float64時,對於有效位數超過 15 位數的數值可能會產生精度損失。

變通方法:掃描 decimal/numeric 欄位進入 string 並使用第三方十進位函式庫 shopspring/decimal ,如 (github.com/shopspring/decimal) 或 cockroachdb/apdgithub.com/cockroachdb/apd),以進行精確運算。 關於模式,請參見 資料型態映射