人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MSSQLをPHPで取り出せないデータがあります Add Star

MSSQLをODBC経由PHPで扱おうと考えています。

SQL文としてエラーになることもなく、文字化けも起こしていないのに、取り出せないデータがあり、困っています。

SELECT * from table_a

として取得しても、取り出せないデータがあります。
SQLエラーもなく、PHP側でも警告/エラーはありません。

該当のデータは日本語でMSSQLの文字コードはSJISです。
PHP側はUTF-8です。

特にエンコードを行なわなくとも、他のデータ(日本語)は問題なく取得〜表示できるのですが、特定のデータのみうまくいきません。

NULLが返ってくるわけでもなく、データが空白となります。

取得後のデータを$rとして、
mb_convert_encoding($r,"UTF-8","SJIS") としても、逆に文字化けを起こしてしまいます。
*この場合は問題のデータだけでなく、取得したデータ全てが文字化けします。
問題となっているデータは空白のままです。

原因として何が考えられますでしょうか?

よろしくお願いします。

*早期解決した場合はボーナスポイントをお支払いします

●質問者: hi-roo.
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● taroe
●250ポイント

>特定のデータ

まずは、特定データ(文字)を断定すべきだと思います。

すべての文字がわからなくても、数個の文字がダメだとわかれば、
あとは、その文字について、
どの段階で、どのように文字コードが変換されているかを考えれば、解決できると思います。

PHP(UTF-8)- ODBC - MSSQL(MS932)

MSのSJISはMS932なので、そのあたりも注意する必要があろうかと思います。
SJISとMS932では微妙に違います。

1.問題となる文字の特定
2.INSERT時にどうなってるか
3.SELECT時にどうなっているか

と地道に切り分けないと、問題を特定できないかと思います。

特定の文字(コード)が、変換できないときに0x00 or 制御文字 or 0x20(空白)に変換されて格納されてしまえば、SELECTするときに、そのまま取り出すわけですから、変になることもあろうかと思います。

>問題となっているデータは空白のままです

DBがMS932である以上、使えない文字があり、それは空白などに通常は自動変換されるはずだったと思います。


hi-roo.さんのコメント
ありがとうございます。色々と試してみます。

2 ● うぃんど
●250ポイント

>他のデータ(日本語)は問題なく取得?表示できる

(可能性1)データ型の不一致

対応できそうな型にCASTしてみたり、
CONVAERTしてみることで対応可能になるかもしれません。

下記のような具合にいくつかくっつけて試してみてください。

SELECT *
 , CAST ( 問題のあるフィールド AS 別のデータ型 )
 , CONVERT ( 別のデータ型, 問題のあるフィールド, スタイル )
FROM table_a

CAST および CONVERT については下記などを参照。
http://msdn.microsoft.com/ja-jp/library/ms187928.aspx


hi-roo.さんのコメント
ありがとうございます。

3 ● gizmo5
●250ポイント

文字型のフィールドでデータの中にバイナリのゼロ(0x00)が入ってるものがあるのではないでしょうか。
空白になってしまうデータに対して、convert 関数を使って 16進表示してみてはどうでしょうか。

select convert(varbinary, フィールド) from table_a
where 問題があるデータを持つ行を特定する条件

(参考)
CAST および CONVERT (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms187928.aspx


hi-roo.さんのコメント
16進数では表示できました。 16進数から文字列へ逆変換したところ、SJISの文字列として表示されました。 やはりDBからPHPに渡った後、データが消失?しているか空白に変換されているのだと思います。

4 ● bg5551
●250ポイント

PHP側の日本語対応の設定を行ってみてはいかがでしょうか。
エラーがなくsql側からデータを取得できているのであればPHPの設定がうたがわれます。
こちらが参考になればいいのですが。

http://ortk.main.jp/blog/?p=67


hi-roo.さんのコメント
ありがとうございます。試してみます。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ