簡體   English   中英

使用 PHP FreeTDS 擴展從 MSSQL 服務器獲取帶有 UTF-8 字符集的數據

[英]Getting data with UTF-8 charset from MSSQL server using PHP FreeTDS extension

我似乎無法使用 FreeTDS 擴展從 MSSQL 中獲取編碼為 UTF-8 的數據。

連接:

ini_set('mssql.charset', 'UTF-8');
$this->_resource = mssql_connect($config['servername'], $config['username'], $config['password']);

我無法使用任何其他擴展。

我試過創建 ~/.freetds.conf

[global]
client charset = UTF-8

我試過將參數傳遞給 php:

php -d mssql.charset="UTF-8" index.php

數據仍然不是 UTF-8。

php -i

mssql

MSSQL Support => enabled
Active Persistent Links => 0
Active Links => 0
Library version => FreeTDS

Directive => Local Value => Master Value
mssql.allow_persistent => On => On
mssql.batchsize => 0 => 0
mssql.charset => no value => no value
mssql.compatability_mode => Off => Off
mssql.connect_timeout => 5 => 5
mssql.datetimeconvert => On => On
mssql.max_links => Unlimited => Unlimited
mssql.max_persistent => Unlimited => Unlimited

想法?

我遇到了類似的問題,並嘗試了我可以在網上找到的所有設置 - 徒勞無功。

就我而言,問題是 FreeTDS 本身的配置。 在 Linux 上,該文件是 /etc/freetds/freetds.conf

我不得不將版本更改為 7.0(也許其他數字也可以。我剛嘗試了 7.0)

[global]
    # TDS protocol version
    tds version = 7.0

在此之后,驅動程序似乎接受了字符集的更改。

ini_set('mssql.charset', 'UTF-8');

順便說一句:更改立即生效,之后無需重新啟動任何東西

MSSQL 和 UTF-8 在...有時是相當痛苦的。 我不得不手動轉換它。 問題:MSSQL 實際上並不知道和支持 UTF-8。

從數據庫值轉換為 UTF-8:

mb_detect_encoding($value, mb_detect_order(), true) === 'UTF-8' ? $value : mb_convert_encoding($value, 'UTF-8');

從 UTF-8 轉換為數據庫值:

mb_convert_encoding($value, 'UCS-2LE', mb_detect_encoding($value, mb_detect_order(), true));

幸運的是,我使用了 Doctrine,所以我所要做的就是創建一個自定義的 StringType 實現。

如果您使用 freeTDS,您應該更改/etc/freetds/freetds.conf以下幾行:

[global]
# TDS protocol version
tds version = 4.2

對此:

[global]
# TDS protocol version
tds version = 8.0
;tds version = 4.2

最后添加這一行:

# set charset
client charset = UTF-8

** clinet 字符集在全局 [范圍]

在您的查詢中,您應該使用 N 字符。 像這樣:

$query = "INSERT INTO dbo.SMSOutbox (StationID, Dest, Text) VALUES ";
   $query .= '(';
   $query .= "'" . $this->stationId . "', ";
   $query .= "'" . $this->destination . "', ";
   $query .= "N'" . $this->text . "'";
   $query .= ')';

您還可以通過在連接到數據庫之前在 $connectionInfo 中添加 CharacterSet UTF-8 來解決此問題。

$serverName = "MyServer";
$connectionInfo = array( "Database"=>"AdventureWorks", "CharacterSet" => "UTF-8");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

工作正常不需要額外的編碼。

似乎需要 7.0 或更高版本。 iconv() 似乎也運行良好,但很乏味。

$query = $this->db->query($sql);
$result = $query->fetchAll(PDO::FETCH_OBJ);
foreach ($result as $row) {
    foreach (get_object_vars($row) as $key => $value) {
    $row->$key = (mb_detect_encoding($value, mb_detect_order(), true) === 'UTF-8') 
            ? $value : iconv('iso-8859-1', 'utf-8', $value);
    }
    $results[] = $row;
}

我遇到了這個問題,它通過在連接到 MSSQL Server 之前將此行添加到我的 php 腳本中解決了:

ini_set('mssql.charset', 'UTF-8');

您應該根據您使用的 SQL 服務器版本更改 TDS 版本。 有關詳細信息,請查看安裝指南。

http://www.freetds.org/userguide/choosingtdsprotocol.htm

我使用與上面相同但 Windows 1250,所以:

$query = $this->db->query($sql);
$result = $query->fetchAll(PDO::FETCH_OBJ);
foreach ($result as $row) {
    foreach (get_object_vars($row) as $key => $value) {
    $row->$key = (mb_detect_encoding($value, mb_detect_order(), true) === 'UTF-8') 
            ? $value : iconv('windows-1250', 'utf-8', $value);
    }
    $results[] = $row;
}

然后它起作用了,但我使用波蘭語字符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM