【问题标题】:Read data with WIN1251 encoding from Firebird database via powershell通过powershell从Firebird数据库中读取WIN1251编码的数据
【发布时间】:2020-01-12 13:45:41
【问题描述】:

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

【问题讨论】:

  • 您使用什么工具显示西里尔符号不正确?您是否尝试将编码从 Win1251 更改为更具可读性? Try this answer to change encoding。如果您在将 C# 代码转换为 Powershell 时遇到困难,我可以提供帮助。
  • 数据库中的列是否有明确的字符集?如果是这样,您是否尝试将 UTF8 指定为连接字符集?
  • 另外,您是否尝试过 Firebird ADO.net 提供程序而不是 ODBC 驱动程序?
  • 谢谢,@MarkRotteveel 将字符集更改为 UTF8 有所帮助。那是怎么工作的?请您创建一个答案,我会接受吗?
  • 有两种选择:您的数据库有字符集为 NONE 的列,并且数据实际上是 UTF8,而不是 WIN1251,或者结合 Powershell 的 ODBC 驱动程序不处理不同的字符串正确设置字符(我认为 powershell 默认为 utf-8)。

标签: powershell odbc firebird firebird2.5


【解决方案1】:

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

这仅在您的数据库确实包含 WIN1251 中的数据并且这些列具有 WIN1251 作为其显式字符集时才有效,如果这些列具有字符集 NONE(或 NULL),那么这仅在数据实际为在 UTF8 中。

问题要么是您的数据不符合您的预期(即不是 WIN1251),要么是 Powershell 和 Firebird ODBC 驱动程序的组合无法处理与控制台字符集不同的字符集正确(如果我没记错的话,Powershell 字符集是 utf-8)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 2016-12-18
    • 2018-01-31
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多