我的数据库具有WIN1251编码的表。当我从表中读取数据时,所有西里尔文字都显示为未知符号。这是我使用的代码:
function Get-ODBC-Data {
param([string]$query = $(throw 'query is required.'))
$conn = New-Object System.Data.Odbc.OdbcConnection
$connStr = "Driver=Firebird/Interbase(r) driver;Server=localhost;Port=3050;Database=C:\Users\user\Desktop\B52.GDB;Uid=SYSDBA;Pwd=masterkey;CHARSET=WIN1251"
$conn.ConnectionString = $connStr
$conn.open
$cmd = new-object System.Data.Odbc.OdbcCommand($query, $conn)
$cmd.CommandTimeout = 15
$ds = New-Object system.Data.DataSet
$da = New-Object system.Data.odbc.odbcDataAdapter($cmd)
[void]$da.fill($ds)
$ds.Tables[0]
$conn.close()
}
$query = @"
SELECT name FROM contact;
"@
$result = Get-ODBC-Data -query $query
$customers = @();
foreach ($row in $result) {
if (-not($null -eq $row.name)) {
$customers += $row.name;
}
}
$customers
答案 0 :(得分:2)
您可以尝试将连接字符集指定为UTF8而不是WIN1251。
仅当您的数据库确实包含WIN1251中的数据并且这些列以WIN1251作为其显式字符集时才有效,如果这些列的字符集为NONE(或NULL
),则只有在数据有效时才起作用实际上是UTF8。
问题是您的数据与您的期望不符(即不是WIN1251),或者Powershell和Firebird ODBC驱动程序的组合无法处理与控制台字符集不同的字符集的字符串正确(如果我没记错的话,Powershell字符集是utf-8)。