如何在Docker中修改SQL Server的LCID与日期格式
解决SQL Server Linux容器LCID和日期格式不生效的问题
问题原因
- 数据卷持久化影响:你挂载了
./drive:/var/opt/mssql数据卷,SQL Server第一次启动时会将实例配置(包括语言、LCID、日期格式)写入该目录,后续修改环境变量不会覆盖已有的持久化配置。 - 仅设置
MSSQL_LCID不足:Linux版SQL Server的MSSQL_LCID仅控制部分区域行为,默认日期格式不会自动随LCID变更,需要单独配置。
解决方案步骤
1. 清理已持久化的配置数据
如果数据卷内无重要数据,先停止容器并删除本地配置目录:
docker-compose down # 可选:备份数据卷内容 cp -r ./drive ./drive_backup # 删除旧配置目录 rm -rf ./drive
2. 修改docker-compose.yml配置
更新配置,添加容器locale设置、匹配的排序规则,并通过启动脚本初始化实例级别的日期格式和语言:
version: "3.2" services: sqlserver: image: mcr.microsoft.com/mssql/server:2019-latest container_name: sqlserver-dev-linux ports: - 1433:1433 environment: ACCEPT_EULA: "Y" SA_PASSWORD: "Password" MSSQL_PID: "Developer" MSSQL_LCID: "1034" MSSQL_COLLATION: "SQL_Latin1_General_CP1_CI_AS" LC_ALL: "en_US.UTF-8" LANG: "en_US.UTF-8" volumes: - './drive:/var/opt/mssql' - './media:/media' command: > /bin/bash -c " # 生成en_US locale文件 locale-gen en_US.UTF-8; # 后台启动SQL Server /opt/mssql/bin/sqlservr & # 等待服务完全启动 sleep 30; # 连接实例配置默认参数 /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Password' -Q ' -- 设置实例默认语言为LCID 1034(us_english) sp_configure ''default language'', 1034; RECONFIGURE; -- 设置实例默认日期格式为dmy sp_configure ''default dateformat'', ''dmy''; RECONFIGURE; '; # 保持进程前台运行 wait " networks: default: external: name: nginx-proxy
3. 验证配置结果
启动容器后,执行以下命令验证配置:
docker exec -it sqlserver-dev-linux /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P 'Password' -Q 'SELECT @@LANGUAGE, @@DATEFORMAT, SERVERPROPERTY(''LCID'')'
预期输出:
us_english dmy 1034
关键说明
MSSQL_COLLATION:指定与en_US/LCID1034匹配的排序规则,确保区域行为一致性。LC_ALL/LANG:强制容器系统locale为en_US.UTF-8,避免SQL Server读取主机的es_ES locale。- 启动脚本:在SQL Server启动后执行配置命令,确保实例级默认设置生效,所有新建用户会自动继承该配置。
内容的提问来源于stack exchange,提问作者aratar79
相关产品推荐
相关产品推荐

