如何使用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
相关产品推荐
相关产品推荐

