You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Testcontainers设置MS SQL Server数据库排序规则

使用Testcontainers启动MS SQL Server时设置数据库排序规则的方法

方法1:设置实例级默认排序规则

MS SQL Server的Docker镜像支持通过MSSQL_COLLATION环境变量指定实例的默认排序规则,后续创建的所有未单独指定规则的数据库都会继承这个设置。

在Testcontainers中直接配置该环境变量即可:

MSSQLContainer<?> sqlServer = new MSSQLContainer<>("mcr.microsoft.com/mssql/server:2022-latest")
    .withEnv("MSSQL_COLLATION", "Chinese_PRC_CI_AS") // 替换为你需要的排序规则
    .withPassword("YourStrong!Passw0rd")
    .acceptLicense();
sqlServer.start();

方法2:创建数据库时单独指定排序规则

如果不需要修改实例级全局规则,仅针对特定业务数据库设置排序规则,可以在容器启动后,通过SQL语句的COLLATE子句单独指定。

方式A:使用初始化脚本

先创建初始化脚本init-db.sql:

CREATE DATABASE MyTestDB
COLLATE Chinese_PRC_CS_AS; -- 区分大小写的中文排序规则

USE MyTestDB;
-- 此处可添加表结构、初始化数据等语句

再在Testcontainers中引用该脚本:

MSSQLContainer<?> sqlServer = new MSSQLContainer<>("mcr.microsoft.com/mssql/server:2022-latest")
    .withPassword("YourStrong!Passw0rd")
    .acceptLicense()
    .withInitScript("init-db.sql");
sqlServer.start();

方式B:代码中动态执行SQL

如果需要根据业务逻辑动态指定排序规则,可通过JDBC连接直接执行创建数据库的SQL:

try (Connection conn = DriverManager.getConnection(
        sqlServer.getJdbcUrl(), 
        sqlServer.getUsername(), 
        sqlServer.getPassword()
)) {
    String createDbSql = "CREATE DATABASE MyTestDB COLLATE Chinese_PRC_CS_AS";
    try (Statement stmt = conn.createStatement()) {
        stmt.execute(createDbSql);
    }
} catch (SQLException e) {
    // 按需处理异常
}

注意事项

  • 实例级排序规则会影响master、model等系统数据库,适合全局统一排序规则的场景。
  • 数据库级排序规则优先级高于实例级,适合单独配置特定业务库的需求。
  • 排序规则命名格式为[语言]_[区域]_[是否区分大小写(CI/CS)]_[是否区分重音(AI/AS)],比如SQL_Latin1_General_CP1_CI_AS是常用的英文不区分大小写规则。

内容的提问来源于stack exchange,提问作者JeanValjean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:50:27