در هنگام ذخیره و بازیابی عبارتهای فارسی( یونیکد ) در SQL Server از طریق php با چند مشکل مواجه خواهید شد
مشکل نخست آنکه با استفاده از کتابخانههای پیشفرض php امکان ذخیره و بازیابی در SQL Server 2008 ممکن نیست
برای حل این مشکل باید فایل زیر را دریافت کنید و در شاخهی php جایگزین کنید
قبل از جایگزین کردن از فایل اصلی پشتیبان تهیه کنید
http://www.helpspot.com/downloads/files/ntwdblib.dll
مشکل دوم آنکه فیلدهای متنی فارسی معمولا با فرمت nvarchar یا ntext ذخیره میشوند
و از طرفی رابط انتقال دهندهی عبارتها از php به SQL با فرمت ANSI کار میکند
اگر هدف ذخیرهی اطلاعات در فیلد nvarchar باشد، تبدیل متن از UTF-8 به UCS-2LE ( یونیکد استاندارد ویندوز ) و سپس تبدیل متن به varbinary مشکل را حل میکند:
<?php
$utf8 = 'متن فارسی';
$ucs2 = iconv('UTF-8', 'UCS-2LE', $utf8);
$hex = unpack( 'H*hex', $ucs2 );
$varbin = "0x{$hex['hex']}";
mssql_query( "INSERT INTO mytable ( nvarcharField ) VALUES ( $varbin )", $link );
?> |
<?php
$utf8 = 'متن فارسی';
$ucs2 = iconv('UTF-8', 'UCS-2LE', $utf8);
$hex = unpack( 'H*hex', $ucs2 );
$varbin = "0x{$hex['hex']}";
mssql_query( "INSERT INTO mytable ( nvarcharField ) VALUES ( $varbin )", $link );
?>
و مشکل سوم در هنگام ذخیرهی متن در فیلدهایی با فرمت ntext به وجود میآید
در این نوع فیلد تبدیل ضمنی از varbinary انجام نمیشود و راه حل آن تبدیل صریح با کمک دستورات SQL هست:
<?php
mssql_query( "INSERT INTO mytable ( ntextField ) VALUES ( CAST( $varbin AS NVARCHAR( 1000 ) )", $link );
?> |
<?php
mssql_query( "INSERT INTO mytable ( ntextField ) VALUES ( CAST( $varbin AS NVARCHAR( 1000 ) )", $link );
?>
برای بازیابی اطلاعات هم میتوانید از قطعه کد زیر که عکس عملیات بالا است، استفاده کنید:
<?php
$result = mssql_query( 'SELECT CONVERT( VARBINARY( 1000 ), nvarcharField ) FROM mytable', $link );
while ( ( $row = mssql_fetch_array( $result, MSSQL_BOTH ) ) ){
echo( iconv( 'UCS-2LE', 'UTF-8', $row[ 'nvarcharField' ] ) );
}
?> |
<?php
$result = mssql_query( 'SELECT CONVERT( VARBINARY( 1000 ), nvarcharField ) FROM mytable', $link );
while ( ( $row = mssql_fetch_array( $result, MSSQL_BOTH ) ) ){
echo( iconv( 'UCS-2LE', 'UTF-8', $row[ 'nvarcharField' ] ) );
}
?>
این شیوه برای استفادههای محدود کاربرد دارد و چنانچه قصد داشته باشید حجم زیادی از اطلاعات را در SQL Server ذخیره و بازیابی کنید بهتر است از افزونهی جدیدی که مایکروسافت برای ارتباط php با SQL Server تهیه کرده استفاده کنید.