19

I can't seem to get data from MSSQL encoded as UTF-8 using FreeTDS extension.

Connecting:

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

I have no ability to use any other extension.

I've tried creating ~/.freetds.conf

[global]
client charset = UTF-8

I've tried passing parameters to php:

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

Data is still not in 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

Ideas?

4

8 に答える 8

31

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

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

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

[global]
    # TDS protocol version
    tds version = 7.0

この後、ドライバーは文字セットの変更を受け入れたようです。

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

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

于 2012-12-14T11:25:34.800 に答える
16

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

于 2012-11-14T11:27:36.543 に答える
16

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 charset はグローバル [スコープ] にあります

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

$query = "INSERT INTO dbo.SMSOutbox (StationID, Dest, Text) VALUES ";
   $query .= '(';
   $query .= "'" . $this->stationId . "', ";
   $query .= "'" . $this->destination . "', ";
   $query .= "N'" . $this->text . "'";
   $query .= ')';
于 2015-02-26T11:58:39.693 に答える
15

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

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

追加のエンコードは必要ありません。

于 2014-06-17T14:07:23.073 に答える
2

私はこの問題を抱えていましたが、MSSQL Server に接続する前に、この行を php スクリプトに追加することで解決しました。

ini_set('mssql.charset', 'UTF-8');
于 2015-07-25T07:21:52.200 に答える
0

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

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

于 2017-11-02T17:40:07.943 に答える