本文列出了驱动程序已知的限制和约束 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进行精确算术。 有关模式,请参见 数据类型映射。