1

我刚刚创建了一个 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) )" ) ;

我究竟做错了什么?

4

1 回答 1

0

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

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

如果你真的需要使用 php_mssql,你必须使用iconv并且可能utf8_decode. 这是我编写的 2 个函数,用于在 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,因此情况可能与我在上面解释的关于 UTF-8 的问题的主要 php_mssql 略有不同......

更新 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.'\');');

?>
于 2012-09-17T15:23:54.957 回答