1

ODBC を使用して、PHP から SQL Server に接続します。PHP では、SQL Server からいくつかの文字列 (nvarchar 列) データを読み取り、それを mysql データベースに挿入したいと考えています。そのような値を mysql データベース テーブルに挿入しようとすると、次の mysql エラーが発生します。

Incorrect string value: '\xB3\xB9ow...' for column 'name' at row 1

すべての ASCII 文字を含む文字列の場合、問題はありませんが、非 ASCII 文字 (一部のヨーロッパ言語) が存在する場合に問題が発生します。

したがって、より一般的に言えば、MS SQL Server データベースには Unicode 文字列があり、PHP によって ODBC 経由で取得されます。次に、mysql データベースに対して実行される sql 挿入クエリに (utf-8 varchar 列の値として) 入れられます。

エンコーディングに関して、この状況で何が起こっているのか誰かが説明してくれますか? どのステップで、どの文字エンコーディング変換が行われる可能性がありますか?

私が使用するのは、PHP 5.2.5、MySQL5.0.45-community-nt、MS Sql Server 2005 です。

PHP はLinuxプラットフォームで実行する必要があります。

更新:この文字列で utf8_encode($s) を呼び出し、その値を mysql 挿入クエリで使用すると、エラーは発生しませんが、挿入された文字列は mysql データベースで正しく表示されません (そのため、utf8 エンコーディングは強制に対してのみ機能します)適切な utf8 文字列ですが、正しい文字が失われます)。

4

3 に答える 3

4

まず、DB のエンコーディングを取得します。次に、ODBC クライアントが使用するエンコーディングを取得します。

ODBC クライアント接続のエンコーディングが DB のエンコーディングと一致しない場合、場合によっては ODBC レイヤーが自動的にデータをトランスコードします。

ここでの秘訣は、ODBC クライアント接続のエンコードを強制することです。

「すべて UTF-8」セットアップの場合:

$conn=odbc_connect(DB_DSN,DB_USR,DB_PWD);
odbc_exec($conn, "SET NAMES 'UTF8'");
odbc_exec($conn, "SET client_encoding='UTF-8'");

// processing here

これは、PostgreSQL + Php 5.x で完全に機能します。正確な構文とオプションは、DB ベンダーによって異なります。

ここでMySqlの非常に便利で明確な追加情報を見つけることができます: http://dev.mysql.com/doc/refman/5.0/fr/charset-connection.html

お役に立てれば。

于 2011-09-05T13:00:13.723 に答える
1

違いがある場合は、 PDO 拡張機能を使用できますか?

SQL サーバーのデータ型を別のものに変更することを提案するユーザー投稿のコメントがここにあります。これが不可能な場合は、フィールドをキャストするユーザー クラスを見てください。

于 2010-05-01T16:58:07.060 に答える
1

PHP 経由の ODBC の経験はありませんが、mysql 関数では PHP はデフォルトで ASCII に設定されているようで、問題を回避したい場合は UTF8 接続を明示的に行う必要があります。

PHP と MySQL サーバーが UTF8 で通信していることは確かですか? PHP 6 までは、Unicode のサポートは面倒なほど一貫性がありません。

MySQL のドキュメントで、Unicode エンコーディングを微調整するための接続文字列パラメーターについて言及されていることを覚えています。

あなたの説明から、PHPは接続をASCIIのみとして扱っているようです。

于 2010-05-01T23:57:18.813 に答える