我刚刚创建了一个MSSQL数据库。校对是SQL_Latin1_General_CP1_CS_AS。我是在服务器上使用freetds的.当我收到来自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: Server消息:在字符串'caf’后插入未关闭引号。(严重性15,过程N/A)在第13行的/www/one/mytest/badchars.php中警告: mssql_query():Sybase: Server消息:在'caf‘附近的不正确语法。(严重性15,过程N/A)在第13行/www/one/mytest/badchars.php中
它提到Sybase是因为服务器最初是为它安装的,但据我所知,Sybase和Mssql函数是相同的,所以不重要。如果我试图将文本限制在引号中,我仍然会得到相同的错误:
mssql_query( "INSERT mytest VALUES('café')" ) ;但是,如果我在Server管理器中运行相同的查询,它就能工作!这样做是可行的:
mssql_query( "INSERT mytest VALUES('caf' + char(233) )" ) ;我做错了什么?
发布于 2012-09-17 15:23:54
我强烈建议您停止使用php_mssql,而是获取Microsoft Drivers for PHP for SQL Server,我们在php_mssql中遇到的几乎任何问题都将得到解决,在使用php_mssql向Server发送和从Server发送和获取UTF-8数据时,会遇到很多麻烦。
在选择文本和nText时,必须强制转换php_mssql和nVarchar,因为php_mssql只支持旧的Server驱动程序.
如果您确实需要使用php_mssql,那么您必须使用iconv,或者utf8_decode。下面是我为在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;
}您将需要根据所使用的语言将Windows1256更改为其他内容。另外,单独尝试utf8_decode和utf8_encode,也许它们适合您的情况。
更新:
由于您使用的是FreeTDS,所以情况可能与我前面解释的关于UTF-8的问题的主php_mssql略有不同.
更新2: --我刚刚在上尝试了这段代码,它看起来很有效,你也能试试吗,也许它也适用于你?
<?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.'\');');
?>https://stackoverflow.com/questions/12462218
复制相似问题