我刚刚创建了一个 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)在第 13 行的 /www/one/mytest/badchars.php 中警告:mssql_query():Sybase:服务器消息:“caf”附近的语法不正确。(严重性 15,过程 N/A)在 /www/one/mytest/badchars.php 第 13 行
它提到 Sybase 的事实是因为最初为它安装了服务器,但我的理解是 Sybase 和 Mssql 功能是相同的,所以应该没关系。如果我尝试将文本 strainght 放入引号中,我仍然会收到相同的错误:
mssql_query( "INSERT mytest VALUES('café')" ) ;
但是,如果我在 SQL Server 管理器中运行相同的查询,它就可以工作!这有效:
mssql_query( "INSERT mytest VALUES('caf' + char(233) )" ) ;
我究竟做错了什么?