我刚刚创建了一个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) )" ) ;
我做错了什么?
答案 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_decode
和utf8_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.'\');');
?>