web-dev-qa-db-ja.com

PHP FreeTDS拡張機能を使用してMSSQLサーバーからUTF-8文字セットでデータを取得する

FreeTDS拡張機能を使用してUTF-8としてエンコードされたMSSQLからデータを取得できないようです。

接続中:

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

アイデア?

19

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実装を作成するだけでした。

16

私は同様の問題を抱えており、ウェブ上で見つけることができるすべての設定を試しました-無駄に。

私の場合、問題はFreeTDS自体の構成にありました。 Linuxでは、ファイルは/etc/freetds/freetds.confです

バージョンを7.0に変更する必要がありました(他の数値も機能する可能性があります。7.0を試しました)

[global]
    # TDS protocol version
    tds version = 7.0

この後、ドライバーは文字セットの変更を受け入れるように見えました。

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

ところで:変更はすぐに有効になり、その後何も再起動する必要はありません

30
mschraudolph

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

**クリネット文字セットはグローバルにあります[スコープ]

クエリでは、N文字を使用する必要があります。このような:

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

DBに接続する前に$ connectionInfoにCharacterSet UTF-8を追加することで、この問題を解決することもできます。

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

うまく機能し、追加のエンコードは必要ありません。

13

この問題が発生したので、MSSQL Serverに接続する前にphpスクリプトに次の行を追加して解決しました。

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

バージョン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;
}
1
jjwdesign

使用しているSQLサーバーのバージョンに基づいて、TDSバージョンを変更する必要があります。詳細については、インストールガイドをご覧ください。

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

0
bstory