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") としても、逆に文字化けを起こしてしまいます。
*この場合は問題のデータだけでなく、取得したデータ全てが文字化けします。
 問題となっているデータは空白のままです。

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

よろしくお願いします。

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

回答の条件
  • 1人50回まで
  • 13歳以上
  • 登録:2014/01/30 09:58:04
  • 終了:2014/02/06 10:00:04

回答(4件)

id:taroe No.1

taroe回答回数1099ベストアンサー獲得回数1322014/01/30 15:26:32

ポイント250pt

>特定のデータ

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

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

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

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

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

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

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

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

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

id:mini-panda

ありがとうございます。色々と試してみます。

2014/02/04 19:03:12
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492014/01/30 16:11:19

ポイント250pt

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

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

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

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

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

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

id:mini-panda

ありがとうございます。

2014/02/04 19:03:14
id:gizmo5 No.3

gizmo5回答回数484ベストアンサー獲得回数1382014/01/30 16:56:17

ポイント250pt

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

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

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

id:mini-panda

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

2014/02/04 19:04:26
id:bg5551 No.4

bg5551回答回数1184ベストアンサー獲得回数802014/02/04 10:02:42

ポイント250pt

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

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

id:mini-panda

ありがとうございます。試してみます。

2014/02/04 19:04:43

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません