web-dev-qa-db-ja.com

PHP + SQL Server-接続用の文字セットを設定する方法?

PHPを使用してSQL Serverデータベースにデータを保存しようとしています。

問題は、特殊文字が適切に変換されないことです。私のアプリの文字セットはiso-8859-1で、サーバーで使用されるものはwindows-1252です。

挿入する前にデータを手動で変換しても効果はありません。何らかの変換が行われているようです。

SQLクエリ 'set char_convert off'を実行しても解決しません。

誰も私がこれを機能させる方法を知っていますか?

編集: ini_set( 'mssql.charset'、 'windows-1252');同様に、しかし、それでも結果はありません。

25
Maurice

クライアントの文字セットは必要ですが、十分ではありません:

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

PHPを介してMSSQL 2008に(Webフォームから)UTF-8データを挿入する方法を2日間検索しました。私はあなたができないすべてを読んで、あなたは最初にUCS2に変換する必要があります(サイファーのソリューションが推奨するように)。 Windowsでは、SQLSRVはMac OSXで開発しているため、試すことができなかった良い解決策であると言われました。

ただし、FreeTDSマニュアル(OSXでmssqlが使用するPHP))では、開始引用符の前に文字「N」を追加するように指示されています。

mssql_query("INSERT INTO table (nvarcharField) VALUES (N'űáúőűá球最大的采购批发平台')", +xon);

この説明によると、N文字はサーバーにUnicodeに変換するように指示します。 https://softwareengineering.stackexchange.com/questions/155859/why-do-we-need-to-put-n-before-strings-in-Microsoft-sql-server

23
Mano Kovacs

同じ問題が発生し、ini_set('mssql.charset', 'utf-8')が機能しませんでした。ただし、大文字で動作しました:

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

次の点を確認することをお勧めします。

  1. 情報を格納する列がncharまたはnvarcharcharおよびnvarcharはUCS-2をサポートしないため(SQLServerはUTF-8形式で保存されません)
  2. PHPで mssql library/extension を使用して接続している場合、次を実行します:ini_set('mssql.charset', 'utf-8'); charset引数(connect、queryなど)
  3. ブラウザの文字セットもUTF-8に設定されていることを確認してください
5
Matt Setter

TDSプロトコルバージョン7以降を使用している場合、回線上のすべての通信はUCS2に変換されます。サーバーは、列がnvarcharまたはntextでない限り、UCS2からテーブルまたは列の照合が設定されているものに変換します。 can UTF-8を通常のvarcharまたはテキストに保存します。6.0または4.2など、7より低いバージョンのTDSプロトコルを使用する必要があります。このメソッドの唯一の欠点は、nvarchar、ntext、またはsys。*テーブルをクエリできないことです(CAST()ingも実行できないと思います)-サーバーは、変換される可能性のあるものの送信を拒否するため7より前のプロトコルバージョンを使用するクライアントへのUTF-8。

TDSプロトコルバージョン7以降(MSSQL 2005以降とほぼ同等)を使用している場合、文字セットの変換を避けることはできません。

4
chugadie

ini_set('mssql.charset', 'UTF-8');が役に立たず、システム全体を変更するルートアクセス権がない場合freetds.confファイル、次のことができます。

1。セットアップ/your/local/freetds.confファイル:

[sqlservername]
    Host=192.168.0.56
    port=1433
    tds version=7.0
    client charset=UTF-8

2。接続DSNがIPではなくサーバー名を使用していることを確認します。

'dsn' => 'dblib:Host=sqlservername;dbname=yourdb

FreeTDSがenv変数を介してphpスクリプトから非特権ユーザーとしてローカルfreetds.confファイルを使用するようにします。

putenv('FREETDSCONF=/your/local/freetds.conf');
4
Attila Fulop

このファイルを編集する私にとって:
/etc/freetds/freetds.conf
...および「tds version」パラメータの「7.0」への変更/設定が役立ちました。 freetds.confを編集して、サーバー構成(またはグローバル)のこのパラメーターを変更してみてください。

Apacheを再起動しなくても動作します。

2
bohdanbobrowski

出力を印刷する前にエンコードを変換するために次のコードを使用して、同様の状況(PDO ODBD接続を使用)で運が良かった:

_$data = mb_convert_encoding($data, 'ISO-8859-1', 'windows-1252');
_

mb_detect_encoding()によって誤って 'ISO-8859-1'として報告されていたため、ソースエンコーディングを手動で設定する必要がありました。

私のデータは別のアプリケーションによってデータベースに保存されていたので、助けになることを願っていますが、私はユニークな状況にあるかもしれません!

2
Jacob Hume

私は、MSSQLデータベースからの結果を変換する別の方法に言及する誰かに気付きませんでした。古き良き iconv() 関数:

iconv (string $in_charset, string $out_charset, string $str): string;

私の場合、結果を取得する際のこの変換を除き、他のすべてが意味のある変換を提供できませんでした。もちろん、これはクエリの結果を解析するループ内で行われます-CP1251からUTF-8まで:

foreach ($records as $row=>$col) {
    $array[$row]['StatusName'] = iconv ('CP1251', 'UTF-8' , $records[$row]['StatusName']);
}

Glyいですが、動作します。

1
bodi0

私の場合、「CharacterSet」パラメーターをsqlsrv_connect()接続のオプションに追加した後に機能しました。

$connectionInfo = array( 
        "Database"=>$DBNAME,
        "ConnectionPooling"=>0,
        "CharacterSet"=>"UTF-8"
);
$LAST_CONNECTION = sqlsrv_connect($DBSERVER, $connectionInfo);

こちらのドキュメントを参照してください: https://docs.Microsoft.com/en-us/sql/connect/php/connection-options?view=sql-server-2017

1
Donovan P

テーブルをアプリケーションのエンコードに変換することはできませんか?または両方でutf-8を使用しますか?

ただし、MSSQLがテーブルレベルのエンコードをサポートしているかどうかはわかりません。

また、上記が失敗する場合は、MB(マルチバイト)文字列関数を試してください。

0

で文字セットを設定する必要があります ini_set( 'mssql.charset'、 'windows-1252') 接続する前に。後に使用する場合 mssql_connect 効果はありません。

0
achos

私の場合、ini_set('mssql.charset', 'UTF-8');を追加するだけでは役に立ちませんでした。列にUTF-8文字セットを指定する必要がありました。

$age = 30;  
$name = utf8_encode("Joe");    

$select = sqlsrv_query($conn, "SELECT * FROM Users WHERE Age = ? AND Name = ?",
    array(array($age), array($name, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING('UTF-8')));
0
Maja S.