PHP用の SQL Server ドライバは何種類かあるが、 Code Conversion 機能があるものはない(?)ようであるが、この確認にあたり、環境により接続できたり 、出来なかったり苦労したため、再度無駄な時間を費やさないための記録。
extension=php_sqlsrv.dll
extension=php_sqlsrv_ts.dll
extension=php_mssql.dll
extension=php_dblib.dll
接続 / Connect
- php_mssql.dll ** では ntwdblib.dll のバージョンが古いと接続できない (バージョン 2000.80.194.0 は OK, 2000.80.0 は NG) という不具合があるので注意。
- また、デフォルトの Windows認証 モードでは SQL Server認証によるログインはでない。
(SQL Server Management Studio でサーバのプロパティ(セキュリティ)を変更) - そして SQL Server構成マネージャにて TCP/IP も有効にしておく必要がある。
文字コード変換 / Code Conversion
- php_sqlsrv.dll ( php_sqlsrv_ts.dll この dll はThread Safe版についてはファイル名を変えているが、同じファイル名のまま thread と no thread のものがあるので注意) は Vesion1.1 にて UTF-8 ハンドリング対応予定であるが、April 2009 Cumulative Update のバージョンは 1.0 の状態であり、 1.1 が待たれる。
- php_dblib.dll (Free TDS)を利用することで SugarCRM *1 や moodle *2では SQL Server を UTF-8 で使用する説明がされている。 しかし、どうやら Windows ではうまく接続ができない。
- 参考 -
Re: FastStack Windows Installer for 5.2.0c with SQL Server: Is FreeTDS necessary or not
Free TDS is necessary when installing SugarCRM in a Linux/Unix Machine and MS SQL in a Windows Machine.
Actually Free TDS is a connector for MSSQL in Linux.
So you do not need Free TDS in a WAMP stack.
---
Yes, your problem is due data conversion between MySQL and SQL Server.
The current version of SQL Server does not support Unicode charset, so you need to dump the mysql database, convert the file from Unicode to Iso-8859-1 and import it into SQL Server.
@odbc_connect
- ODBC を使用した場合、Driver名の指定がSQL Server のバージョンにより異なる。
http://blogs.msdn.com/ssds/archive/2009/03/27/9515262.aspx
Driver
ODBC driver to use:
{SQL Server} – Legacy SQL Server driver
{SQL Native Client} – SQL 2005 Native Client
{SQL Server Native Client 10.0} – SQL 2008 Native Client
PHP.ini
php_mssql.dll にてWindows認証を利用する場合 On
; Use NT authentication when connecting to the server
mssql.secure_connection = Off
;mssql.secure_connection = On
Linux などで FreeTDS(php_dblib.dll ?) を利用して Code Conversion する場合に設定
; Specify client character set.
; If empty or not set the client charset from freetds.comf is used
; This is only used when compiled with FreeTDS
mssql.charset = "ISO-8859-1"
;mssql.charset = "utf-8"
Test Script
C:\>sqlcmd -U test -P test -S TEST\SQLEXPRESS
utf-8 / Shift-JIS$dbhost = 'test\SQLEXPRESS' ;
$dbuser = 'test' ;
$dbpassword = 'test' ;
$dbname = 'test';
$query = "SELECT name FROM test.dbo.accounts";
// php_mssql.dll http://www.mmdb.net/m_kaneko/php/mssql.htm
$db = mssql_connect($dbhost, $dbuser, $dbpassword);
$res = mssql_query($query,$db);
while($row = mssql_fetch_array($res)){
echo $row['name']."
" ;
}
mssql_free_result($res);
mssql_close();
// http://www.agtech.co.jp/html/v8manuals/linux/linuxcon6.html
$db = @odbc_connect("Driver={SQL Server Native Client 10.0};Server=$dbhost;Database=$dbname;", $dbuser, $dbpassword);
$result = odbc_exec($db, $query);
$i = 0 ;
$numcols = odbc_num_fields($result);
while(odbc_fetch_row($result))
{
while ($i < $numcols)
{
$i++;
$row = odbc_result($result, $i);
echo $row . "
" ;
}
$i = 0;
}
odbc_close($db);
?>
*1 SugarCRM は SQL Sever対応しているが nvarcharタイプを使用していないことから、 Free TDS を利用してコード変換、あるいは php_sqlsrv.dll が UTF-8ハンドリング対応したとしても列の属性変更が必要と思われる。
関連 SQL Serverを使う場合はUCS-2への変換が必要*2 SQL Server 2000 だと接続できるか(?)
SQL Server 2008 Express に IIS7+FasdtCGI で mssql_connect(php_mssql.dll) するときは ntwdblib.dll は不要