通过powershell从Firebird数据库读取WIN1251编码的数据

通过powershell从Firebird数据库读取WIN1251编码的数据,powershell,odbc,firebird,firebird2.5,Powershell,Odbc,Firebird,Firebird2.5,我有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;S

我有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

您可以尝试将连接字符集指定为UTF8而不是WIN1251

只有当您的数据库中确实包含WIN1251中的数据,并且这些列的显式字符集为WIN1251时,这才有效;如果这些列的字符集为NONE(或
NULL
),则只有当数据实际位于UTF8中时,这才有效


问题是您的数据不符合您的期望(即它不是WIN1251),或者Powershell和Firebird ODBC驱动程序的组合不能正确处理控制台字符集以外的字符集中的字符串(如果我没有弄错的话,Powershell字符集是utf-8).

您使用的是什么工具错误地显示西里尔字母符号?您是否正在尝试将编码从Win1251更改为更可读的格式。如果您在将C#代码转换为Powershell时遇到困难,我可以提供帮助。数据库中的列是否具有显式字符集?如果是,您是否尝试过将UTF8指定为连接字符集?此外,您是否尝试过Firebird ADO.net提供程序而不是ODBC驱动程序?谢谢,@markrotVeel将字符集更改为UTF8很有帮助。那是怎么回事?请您创建一个答案,我会接受它。有两个选项:您的数据库有字符集为NONE的列,数据实际上是UTF8格式,而不是WIN1251格式,或者与Powershell结合使用的ODBC驱动程序无法正确处理不同字符集中的字符串(我认为Powershell默认为utf-8)。