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/numericstring第三方十进制库(如shopspring/decimalgithub.com/shopspring/decimal)或(cockroachdb/apdgithub.com/cockroachdb/apd进行精确算术。 有关模式,请参见 数据类型映射