本文列出驅動程式已知的限制與限制 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.Exec 且 db.Query 通話可能使用不同的池連線。 一個在一個通話中建立的本地暫存資料表,在下一個通話在不同連線上執行時,在下一個通話中看不到。
對於全域暫存資料表,跨連線的可見性運作正常,但在同時工作負載中,生命週期與命名衝突仍需注意。
指引:用於 db.Conn(ctx) 將相關操作釘選到單一連線,或在交易中包裝操作。 僅在需要跨會話可視性時使用全域暫存資料表。
關於實作模式,請參見 暫存資料表與儲存程序、 連線池化及 暫存資料表未找到。
永遠加密約束
- 有加密欄位的批量複製:驅動程式不支援對欄位始終加密的資料表進行批量複製操作。
- 安全隔區:驅動程式不支援「始終加密」並使用安全隔區。
-
提供者註冊:您必須匯入金鑰提供者套件(
localcert,akv),作為副產品匯入。 沒有它,驅動程式無法解密資料。 -
精確參數類型匹配:加密參數必須與 SQL Server 欄位類型高度匹配。 預設的 Go
string會變成nvarchar,但對於更特定的加密參數類型可能會失敗。 -
char加密與varchar文字:目前對加密char或varchar欄位的插入與更新有限。 當你需要「永遠加密」來處理文字資料時,建議使用加密nchar或nvarchar欄位。
舊版 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/apd (github.com/cockroachdb/apd),以進行精確運算。 關於模式,請參見 資料型態映射。