ホームページ  >  記事  >  バックエンド開発  >  MSSQL データベースのテキスト型フィールドが PHP で切り捨てられる理由の解決策

MSSQL データベースのテキスト型フィールドが PHP で切り捨てられる理由の解決策

巴扎黑
巴扎黑オリジナル
2016-11-10 10:07:401452ブラウズ

PHP では MSSQL データベースが使用されており、データベース内でテキスト型フィールドが使用されていたため、問題が発生しました。データベースのデータをクエリするたびに、必ず不可解に切り捨てられます。最初は、使用した PHP フレームワークには文字列の長さに制限があるのではないかと思いました。後で、送信時にこれが愚かな考えであることがわかりました。データを取得した場合、文字列の内容をすべてデータベースに送信することはできましたが、この現象は読み取り時にのみ発生するため、同様の問題が発生していないかネットで検索しました。幸運にも最初の検索で解決策を見つけることができたので、私自身と大多数の PHP 愛好家の必要に応じて、それをブログに再投稿することにしました。
次の 2 つの解決策があります。
1. これを実現するには、php.ini を変更します。
php.ini を開くと、mssql.textsize と mssql.textlimit の 2 つのオプションが表示されます。 有効な範囲は 0 ~ 2147483647 です。 4096 .
;mssql.textlimit = 4096

; 有効範囲は 0 ~ 2147483647 です。デフォルト = 4096.
;mssql.textsize = 4096

デフォルトの構成は 4096 バイトであり、多くの場合 4K に切り捨てられることがわかります。適切なサイズに変更し、直前のセミコロンを削除して保存し、WEB サーバーを再起動します。

上記の 2 つのオプションから、範囲は 0 ~ 2147483647 バイトであることがわかります。

if(MS_SQL_G(textlimit)!=-1){
sprintf(buffer,"%li",MS_SQL_G(textlimit));
if(DBSETOPT(mssql.link,DBTEXTLIMIT,buffer)==FAIL){
efree(hashed_details);
dbfreelogin(mssql.login);
RETURN_FALSE;
}
}
if(MS_SQL_G(textsize)!=-1){
sprintf(buffer,"SETTEXTSIZE%li",MS_SQL_G(textsize));
dbcmd(mssql.link,buffer);
dbsqlexec(mssql.link);
dbresults(mssql.link);
}

2. PHP で SELECT クエリを実行する前に SET TEXTSIZE を実行します:

mssql_query("SETTEXTSIZE65536");

上記の PHP ソース コードから、SET TEXTSIZE が実際に実行されることがわかります。

上記の方法が機能しない場合は、クエリ ステートメントで CAST 関数を使用してみてください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。