2016-07-17 14 views
0

接続文字列は、PHP PDO Firebirdの文字セットは決して変更されません。

firebird:dbname=PRODUCTS.GDB;charset=UTF8

しかし、Unicode文字が正しく返されません。私は、ISO8859_9のような他の文字セットに、ダッシュ、大文字、大文字の有無にかかわらずutf-8に変更しようとしました。すべて同じです。

+0

関連する列の文字セットとは何ですか?また、データのサンプルであるDDL、予期した結果、受け取った結果を含めることができますか? –

+0

列の文字セットは「なし」です。接続文字列をchartset = NONEに設定することは役に立ちません。 「NONE」文字セットを使用するソフトウェアクライアントは、正しい文字を返しますが、PDOは返しません。ブラウザで、文字セットを手動で変更すると正しく表示されます。 以下のように表示されます: ANTAS YAH 表示されるはずです:ÇANTASİYAH – Turab

答えて

1

問題は、列に文字セットNONEを使用していることです。文字セットがNONEのカラムの場合、Firebirdは指定された接続文字セットに変換することができず、データをそのまま送信します。処理はクライアントアプリケーションまたはドライバに固有のもので、デフォルトのシステムエンコーディングが適用されるものもあれば、(あなたの場合はUTF-8の)接続文字セット内にあるとみなされるものもあります。これを行うと論理的(たとえば、UTF-8で保存し、別のアプリケーションがWindows-1254またはISO-8859-9を予期して取得しているため)。

このアプリケーションでは、格納されたデータが特定の文字セット内にあるとみなして正しいと推測するため、別のアプリケーションで正しく表示されることがあります。

PHPやPDOについてよく分かりませんが、文字列が正しく変換される可能性があるため、接続文字列にデータの実際の文字セット(WIN1254ではなくUTF8)を指定することが考えられます。

ただし、実際の解決策は、NONE以外の既定の文字セットを使用して新しいデータベースを作成し、DDLを実行して(異なるものを必要とする列に対して明示的な文字セットを指定する)、データをポンピングします古いデータベースから新しいデータベースに、適切な文字セット変換を適用していることを確認してください。

これを行うと、このデータベースに接続するすべてのアプリケーションで明示的な接続文字セットを使用する必要もあります。

+0

文字セットを変更しようとしていますが、それは役に立たないです。私はこれらのクエリを実行しました。 'ALTER CHARACTER SET utf8 SET DEFAULT COLLATION utf8'と' ALTER TABLE STOKKART ALTER COLUMN STOK_ADI VARCHAR(60)CHARACTER SET utf8'です。 クエリはエラーなしで実行されました。 charaterセットはまだ "NONE"でutfの文字はまだ破損しています。 – Turab

+0

さて、EFS移行ツールを使用して、実際の文字セットで新しいDBに移動しました。 UTF8は使用できませんでした。クライアントがWIN1254モードでのみ動作しているので、私はWIN1254に切り替える必要がありました。今度はDBをWIN1254に切り替えましたが、クライアントはまだ動作していますが、PDOはまだブラウザ上で動作しません。私が手動でそのページのブラウザの文字セットを切り替えると、正しく表示されます。しかし、データベースの挿入はまだ壊れています。 – Turab

+0

@Turabその後、何が間違っているのかわからない。接続文字セットとしてutf8を指定していますか? –

関連する問題