PHP / PDO和SQL Server连接以及i18n问题

时间:2008-10-07 13:50:33

标签: php sql-server sql-server-2005

在我们的网络应用程序中,我们使用PHP5.2.6 + PDO连接到SQL Server 2005数据库并存储俄语文本。

数据库归类为Cyrillic_General_CI_AS,表归类为Cyrillic_General_CI_AS,列类型为NVARCHAR(MAX)

我们尝试使用以下两种方案连接到数据库,这两种方案都会导致不同的问题。

  1. PDO mssql:

    $dbh = new PDO ('mssql:host='.$mssql_server.';dbname='.$mssql_db, $mssql_login, $mssql_pwd);
    

    在这种情况下是一个简单查询的结果:

    SELECT field1 FROM tbl1 WHERE id=1
    

    显示field1数据被截断为255个字节。

  2. PDO odbc:

    $dbh = new PDO ('odbc:DSN=myDSN;UID='.$mssql_login.';PWD='.$mssql_pwd);
    

    在这种情况下,同一查询的结果显示完全没有截断的数据,但带有问号而不是俄语符号。


  3. 注意:

    • 在SQL Management Studio中,数据不会被截断,俄语符号也会正确显示。
    • 我们有Windows 2003 Enterprise Edition SP2

    那么我们应该选择什么作为连接方法以及如何解决相应的问题?

5 个答案:

答案 0 :(得分:2)

连接后尝试执行SET NAMES "charset"

我不知道匹配Cyrillic_General_CI_AS的字符集是什么,但尝试“西里尔字母”?

答案 1 :(得分:1)

我必须这样做以从MSSQL中的NVARCHAR字段获取可用数据:

$_ = iconv('Windows-1252', 'UTF-8', $_);

答案 2 :(得分:0)

我总是使用utf8_general_ci获得最好的运气 - 连接,整理 - 一切。

但是,我只有MySQL和PostgreSql的经验 - 而不是SQL Server。

关于你的DSN问题 - 我不确定。

祝你好运!

答案 3 :(得分:0)

如果您未在PDO上设置,请使用FreeTDS - 也称为过程mssql_ *调用。这是推荐的解决方法之一,直到PDO 修复。自PHP 5.1.2起,FreeTDS就有mssql.charset-option

答案 4 :(得分:0)

我也注意到了同样的问题,使用PDO实现了SQL Server 2005和PHP 5.x.当我将nvarchar(MAX)字段更改为nvarchar(255)时,奇数问号字符停止出现。我绝对相信它与PDO和MS SQL服务器中的ODBC驱动程序有关。当您隐式指定varchar中的最大字符时,它可以解决问题。