Azure Runbook通过psql写入CosmosDB PostgreSQL时UTF-8编码异常
环境配置
- 使用Azure Runbook,通过混合工作器调用psql工具,向兼容PostgreSQL的Azure Cosmos DB插入数据
问题描述
插入包含瑞典字符å、ä、ö的数据时,数据库中这些字符会变为问号(例如"Fjäril"变为"Fj?ril")。但直接在混合工作器所在VM上用同一账号运行完全相同的代码、使用相同数据/库/表结构时,字符显示正常。
Runbook中插入前用Write-Output输出数据到日志,åäö字符显示正常。未使用子Runbook,单独测试Runbook仍出现该问题。
涉及的psql执行代码:
"INSERT INTO $Schema.$table VALUES('$Guid','$Givenname','$Username','$Surname','$Name');" | & "$psqlpath\psql" --csv $dburl -c
已尝试的排查措施
- 确认数据库采用UTF-8编码
- 在psql命令中添加
SET client_encoding = 'UTF8';设置编码 - 将混合工作器所在VM的系统区域设置为UTF-8
解决方案建议
- 强制PowerShell输出UTF-8编码
Azure Runbook的PowerShell环境默认输出编码可能不是UTF-8,导致管道传递给psql的文本编码错误。可在输出SQL语句前设置输出编码:
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::UTF8
或直接生成UTF-8编码的SQL字符串传递:
$sql = "INSERT INTO $Schema.$table VALUES('$Guid','$Givenname','$Username','$Surname','$Name');" $utf8Bytes = [System.Text.Encoding]::UTF8.GetBytes($sql) $utf8Sql = [System.Text.Encoding]::UTF8.GetString($utf8Bytes) $utf8Sql | & "$psqlpath\psql" --csv $dburl -c
- 通过psql命令行参数指定编码
除了在SQL中设置client_encoding,可直接通过psql参数强制指定客户端编码:
"INSERT INTO $Schema.$table VALUES('$Guid','$Givenname','$Username','$Surname','$Name');" | & "$psqlpath\psql" --csv --encoding=UTF8 $dburl -c
- 检查并统一Runbook执行环境编码
混合工作器的Runbook执行会话编码可能与交互式登录不同,可在Runbook中添加代码输出当前编码确认问题:
Write-Output "控制台输出编码: $([Console]::OutputEncoding)" Write-Output "控制台输入编码: $([Console]::InputEncoding)" Write-Output "系统默认编码: $([System.Text.Encoding]::Default)"
若输出非UTF-8,在Runbook开头统一设置编码:
[Console]::InputEncoding = [System.Text.UTF8Encoding]::UTF8 [Console]::OutputEncoding = [System.Text.UTF8Encoding]::UTF8
- 使用参数化查询避免编码与注入问题
直接字符串插值可能引发编码转换问题,建议用psql参数化查询替代:
$sql = "INSERT INTO $Schema.$table (guid, givenname, username, surname, name) VALUES (@guid, @givenname, @username, @surname, @name);" & "$psqlpath\psql" --csv $dburl -c $sql -v guid='$Guid' -v givenname='$Givenname' -v username='$Username' -v surname='$Surname' -v name='$Name'
内容的提问来源于stack exchange,提问作者Erik Andersson
相关产品推荐
相关产品推荐

