MSSQLをODBC経由PHPで扱おうと考えています。
SQL文としてエラーになることもなく、文字化けも起こしていないのに、取り出せないデータがあり、困っています。
SELECT * from table_a
として取得しても、取り出せないデータがあります。
SQLエラーもなく、PHP側でも警告/エラーはありません。
該当のデータは日本語でMSSQLの文字コードはSJISです。
PHP側はUTF-8です。
特にエンコードを行なわなくとも、他のデータ(日本語)は問題なく取得〜表示できるのですが、特定のデータのみうまくいきません。
NULLが返ってくるわけでもなく、データが空白となります。
取得後のデータを$rとして、
mb_convert_encoding($r,"UTF-8","SJIS") としても、逆に文字化けを起こしてしまいます。
*この場合は問題のデータだけでなく、取得したデータ全てが文字化けします。
問題となっているデータは空白のままです。
原因として何が考えられますでしょうか?
よろしくお願いします。
*早期解決した場合はボーナスポイントをお支払いします
>特定のデータ
まずは、特定データ(文字)を断定すべきだと思います。
すべての文字がわからなくても、数個の文字がダメだとわかれば、
あとは、その文字について、
どの段階で、どのように文字コードが変換されているかを考えれば、解決できると思います。
PHP(UTF-8)- ODBC - MSSQL(MS932)
MSのSJISはMS932なので、そのあたりも注意する必要があろうかと思います。
SJISとMS932では微妙に違います。
1.問題となる文字の特定
2.INSERT時にどうなってるか
3.SELECT時にどうなっているか
と地道に切り分けないと、問題を特定できないかと思います。
特定の文字(コード)が、変換できないときに0x00 or 制御文字 or 0x20(空白)に変換されて格納されてしまえば、SELECTするときに、そのまま取り出すわけですから、変になることもあろうかと思います。
>問題となっているデータは空白のままです
DBがMS932である以上、使えない文字があり、それは空白などに通常は自動変換されるはずだったと思います。
>他のデータ(日本語)は問題なく取得~表示できる
(可能性1)データ型の不一致
対応できそうな型にCASTしてみたり、
CONVAERTしてみることで対応可能になるかもしれません。
下記のような具合にいくつかくっつけて試してみてください。
SELECT * , CAST ( 問題のあるフィールド AS 別のデータ型 ) , CONVERT ( 別のデータ型, 問題のあるフィールド, スタイル ) FROM table_a
CAST および CONVERT については下記などを参照。
http://msdn.microsoft.com/ja-jp/library/ms187928.aspx
ありがとうございます。
文字型のフィールドでデータの中にバイナリのゼロ(0x00)が入ってるものがあるのではないでしょうか。
空白になってしまうデータに対して、convert 関数を使って 16進表示してみてはどうでしょうか。
select convert(varbinary, フィールド) from table_a where 問題があるデータを持つ行を特定する条件
(参考)
CAST および CONVERT (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms187928.aspx
16進数では表示できました。
16進数から文字列へ逆変換したところ、SJISの文字列として表示されました。
やはりDBからPHPに渡った後、データが消失?しているか空白に変換されているのだと思います。
PHP側の日本語対応の設定を行ってみてはいかがでしょうか。
エラーがなくsql側からデータを取得できているのであればPHPの設定がうたがわれます。
こちらが参考になればいいのですが。
http://ortk.main.jp/blog/?p=67
ありがとうございます。試してみます。
ありがとうございます。色々と試してみます。
2014/02/04 19:03:12