PHP中的MSSQL查询问题和查询文本数据

32
我正在尝试使用PHP查询MSSQL EXPRESS(2008 R2)数据库并提取数据。但是,当我从数据库中拉取基于ntext的数据时,出现错误。

错误如下:

Unicode数据在仅限Unicode的排序规则或ntext数据中不能发送到使用DB-Library(例如ISQL)或ODBC版本3.7或更早版本的客户端。 (严重性16)

我的脚本如下:

    $myServer = ".\SQLEXPRESS";
    $myUser = "sa";
    $myPass = "blablabla";
    $myDB = "test"; 

    //connection to the database
    $dbhandle = mssql_connect($myServer, $myUser, $myPass)
      or die("Couldn't connect to SQL Server on $myServer"); 

    //select a database to work with
    $selected = mssql_select_db($myDB, $dbhandle)
      or die("Couldn't open database $myDB"); 

    //declare the SQL statement that will query the database
    $query = "SELECT * FROM dbo.table WHERE query='2'";
    //$query .= "FROM dbo.table  ";
    //$query .= "WHERE query='2'"; 

    //execute the SQL query and return records
    $result = mssql_query($query);

    $numRows = mssql_num_rows($result); 
    echo "<h1>" . $numRows . " Row" . ($numRows == 1 ? "" : "s") . " Returned </h1>"; 

    //display the results 
    while($row = mssql_fetch_array($result))
    {
      echo "<li>" . $row["query"]. "</li>";
    }
    //close the connection
    mssql_close($dbhandle); 

非常感谢您的帮助...

谢谢...

3个回答

61

根据 手册页面 上的评论,有几个选项:

  • SELECT CAST(field1 AS TEXT) AS field1 FROM table
  • 如果 PHP 服务器是 *nix 系统,则将 /etc/freetds.conf 中的版本从 4.2 更改为 8.0
  • 避免使用 SELECT * 查询

如果在该页面上搜索 ntext,则会有更多选项。


3
将"field1"字段转换为文本格式,并将其命名为"field1"。 - megazoid
3
第二种方法对我很有效,但对我来说太神奇了,我不理解。"将 /etc/freetds.conf 中的版本从 4.2 更改为 8.0(如果 PHP 服务器是 *nix)" - LucVH
3
8.0的技巧很奇怪...对我也起作用了。谢谢!请注意,我的freetds conf文件实际上在/etc/freetds/freetds.conf中。 - user2662680
1
根据FreeTds文档,版本8是版本7.1的别名,适用于SQL Server 2000,非常老旧。建议您使用版本7.4,然后根据需要修复查询。http://www.freetds.org/userguide/choosingtdsprotocol.htm - Matt
1
对于使用 Laravel 的任何人。我通过在 database.php 配置文件中的 sqlsrv 驱动程序中添加 "version" => "8.0" 来修复了它。 - Kristaps J.

54

以下是您可能需要了解的一些内容:

  1. 为Debian(Lenny/Squeeze)安装mssql支持:

    apt-get install php5-sybase

  2. 当您收到此错误消息时:

    "Unicode数据在仅使用Unicode排序规则或ntext数据的情况下无法发送到使用DB-Library(如ISQL)或ODBC 3.7或更早版本的客户端。"

    请在/etc/freetds/freetds.conf中添加这两行(最后两行):

    [global]
    ;tds version = 4.2
    tds version = 8.0
    client charset = UTF-8
    
    你也可以在php.ini中编辑"charset"(如果你之前在freetds.conf中已经设置过,那么你就不需要这样做了): ; 指定客户端字符集... ; 如果为空或未设置,则使用freetds.comf中的客户端字符集 ; 仅当编译时使用FreeTDS时才会使用此选项
    mssql.charset = "UTF-8"
    
  3. 如果需要支持Unicode,请使用nchar/nvarchar/ntext列类型。


你救了我,因为我没有访问 PHP 应用程序的权限。 - Edenshaw
谢谢!你帮了我很多。 - Ennio Sousa
1
我正在使用Python,但遇到了同样的问题- 这个解决方案对那个问题也非常有效。谢谢! - Robert Hafner

8

在我的情况下,我需要安装:

sudo apt-get install php-sybase

并修改 /etc/freetds.conf 文件:

...
[global]
    # TDS protocol version
;   tds version = 4.2
tds version = 8.0
client charset = UTF-8
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接