MSSQL データベースを作成しました。照合順序は SQL_Latin1_General_CP1_CS_AS です。freetds を使用して Linux-Apache-PHP サーバーから使用します。Web フォームからテキストを受け取り、特殊文字 (カフェなど) を含むテキストを挿入しようとすると、エラーが発生します。
<?php
ini_set('display_errors', '1') ;
$MyConn = mssql_connect( "MSPROD", "one", "1a!logas1" ) ;
mssql_select_db( "SIAM", $MyConn ) ;
if ( isset( $_GET['arg'] ) )
{
$arg = $_GET['arg'] ;
print "Inserting '$arg'<br>\n" ;
for ( $i = 0 ; $i < strlen( $arg ) ; $i ++ )
{
print dechex( ord( $arg{$i} ) ) . ' ' ;
}
mssql_query( "INSERT mytest VALUES('$arg')" ) ;
}
?>
<form action=badchars.php method=get>
<input type=text name=arg>
</form>
これはエラーです:
'café' を挿入しています 63 61 66 e9 警告: mssql_query(): Sybase: サーバー メッセージ: 文字列 'caf' の後の引用符が閉じていません。(重大度 15、手順 N/A) /www/one/mytest/badchars.php の 13 行目 警告: mssql_query(): Sybase: サーバー メッセージ: 'caf' 付近の構文が正しくありません。(重大度 15、手順 N/A) /www/one/mytest/badchars.php の 13 行目
Sybase に言及しているのは、サーバーが最初にインストールされたためですが、Sybase と Msql の機能は同一であることを理解しているため、問題にはなりません。テキストを引用符で囲もうとすると、同じエラーが発生します。
mssql_query( "INSERT mytest VALUES('café')" ) ;
しかし、SQL Server Manager で同じクエリを実行すると、うまくいきます。これは機能します:
mssql_query( "INSERT mytest VALUES('caf' + char(233) )" ) ;
私は何を間違っていますか?