将特殊字符从PHP插入Microsoft SQL Server

时间:2012-09-17 15:13:15

标签: php sql-server sql-server-2008

我刚刚创建了一个MSSQL数据库。 排序规则是SQL_Latin1_General_CP1_CS_AS。 我在使用freetds的Linux-Apache-PHP服务器上使用它。 当我从网络表单接收文本,并尝试插入包含特殊字符的文本(例如café)时,我收到错误。

<?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é'6361 66 e9警告:mssql_query():Sybase:Server   消息:字符串'caf'后的未闭合的引号。   (严重程度15,程序N / A)在/www/one/mytest/badchars.php上   第13行警告:mssql_query():Sybase:服务器消息:不正确   'caf'附近的语法。 (严重程度15,程序N / A)in   第13行/www/one/mytest/badchars.php

它提到Sybase的事实是因为最初为它安装了服务器,但我理解Sybase和Mssql函数是相同的,所以它应该没关系。 如果我试着将文本strainght放入引号,我仍然会得到同样的错误:

mssql_query( "INSERT mytest VALUES('café')" ) ;

但是,如果我在SQL Server Manager中运行相同的查询,它就可以了! 这有效:

mssql_query( "INSERT mytest VALUES('caf' + char(233) )" ) ;

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我强烈建议你停止使用php_mssql,而不是获取Microsoft Drivers for PHP for SQL Server几乎所有我们在php_mssql中遇到的问题都会得到解决,你在发送和获取时会遇到很多麻烦使用php_mssql与SQL Server之间的UTF-8数据。

在选择Text和Varchar时,您必须使用CAST nText和nVarchar,因为php_mssql仅支持旧的SQL Server驱动程序...

如果你真的需要使用php_mssql,你必须使用iconv,也许utf8_decode。以下是我编写的两个函数,用于存储和获取SQL Server中的UTF-8波斯语/阿拉伯语数据。

function persian_sql_to_php($str){
    if(mb_detect_encoding($str) == 'UTF-8' AND mb_check_encoding($str, 'UTF-8')){
        $str = utf8_decode($str);
    }
    $str = iconv('Windows-1256', 'UTF-8', $str);
    return $str;
}

function persian_php_to_sql($str){
    $str = iconv('UTF-8', 'Windows-1256', $str);
    return $str;
}

根据您使用的语言,您需要将Windows-1256更改为其他内容。也可以单独试用utf8_decodeutf8_encode,也许它们适用于您的情况。

<强>更新

由于你使用的是FreeTDS,情况可能与我上面解释的主要php_mssql有点不同,关于UTF-8的问题......

更新2: 我刚刚在Windows上尝试了这个代码,它看起来很有用,你也可以尝试一下,也许它对你有用吗?

<?php

mssql_connect('127.0.0.1', 'sa', '123456');
mssql_select_db('test');

$val = 'café';

$val = iconv('UTF-8', 'ISO-8859-1', $val);

mssql_query('INSERT INTO mytest (test) VALUES (\''.$val.'\');');

?>