[PHP-users 3267] Re: 半角カナについて

ishiguro php-users@php.gr.jp
Fri, 02 Nov 2001 18:08:27 +0900


いしぐろです。
ちょっと、間があいてしまいましたが、まだ解決しておりません。
レスポンス悪くてすみません。

>半角文字=1バイト が成り立つかどうかは、文字コードに寄ります。
>#例えば、EUC-JPでは、半角カナは2バイトになります。
>
>また、そのVerchar2が、「文字数」単位か「バイト数」単位か、
>きちんと把握していないと、落し穴にはまるかも知れません。
>#文字数の場合、DB側が文字コードを把握していないと…。
>
>「表示されません」というのは、「全く」でしょうか。
>「5文字目以降の部分が」でしょうか。
>(文字化けするという分けではないですよね?)
>
>その辺りにも、注意が要るかも知れません。

OracleでVerchar2(35) Byteです。
で、定義されている項目があります。
そこに「1234567890アイウエオアイウエオ123456」というデータが入っていると表示されますが、
一文字たして「1234567890アイウエオアイウエオ1234567」にすると何にも表示されなくなります。
半角カナは2バイト、半角数字は1バイトとして計算して、Oracleの項目のサイズを
オーバーした場合、このような現象になるようです。
(上記の場合、何故か36バイト分までは表示されますが、サイズが奇数の為と思われます。)
ソースは以下のようになります。

	$cur=OCILogon("Acc","Pass","Setsuzoku");
	$stmt=OCIParse($cur,"SELECT * FROM Table");
	OCIexecute($stmt,OCI_DEFAULT);
	OCIFetch($stmt);
	$FieldNum = OCINumCols($stmt);
	echo ("<TABLE>");
	While(OCIFetch($stmt))
	{
		echo ("<TR>");
		For($col = 1;$col<=$FieldNum;$col++)
		{
			echo ("<td align=center nowrap>");

			echo(OCIcolumnisnull($stmt,$col). "<BR>");
			echo(OCIstatementtype($stmt). "<BR>");
			echo(OCIcolumnname($stmt,$col). "<BR>");
			echo(OCIcolumntype($stmt,$col). "<BR>");
			echo(OCIcolumnsize($stmt,$col). "<BR>");
			echo(OCIerror($stmt). "<BR>");
			echo(strlen(OCIResult($stmt,$col)) . "<BR>");

			if(OCIResult($stmt,$col) <> "")
			{
				echo ("<font size=3>" . trim(OCIResult($stmt,$col)));
			}
			else
			{
ここに入ると表示されない	echo ("<font size=3>&nbsp");
			}
			echo ("</font></td>");
		}
		echo ("</TR>");
	}
	echo ("</TABLE>");
	・
	・
結果として、後述例の場合は、OCIResult($stmt,$col)に文字列長0の文字列「""」が戻ってきます。
NULLではないようです。レングスも0でした。項目名その他はきちんと戻ってきます。

OracleのサーバとApacheのサーバは別なのですが、Apacheのサーバ上のSQLPlusから同じ
SQLを投げてみるとどちらのデータでも正しい結果が返ってきますので、PHPの設定か、
プログラムの問題と考えています。

すっかり、いきずまっております。何かお解りになりましたら、ご教授願います。