2008-10-07 46 views
5

在我们的网络应用中,我们使用PHP5.2.6 + PDO连接到SQL Server 2005数据库并存储俄文文本。PHP/PDO和SQL Server连接和国际化问题

数据库整理是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 
    

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

  2. PDO ODBC:

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

    在这种情况下,同一个查询的结果显示完全不截断的数据,但在问号而非俄罗斯的符号。


注:

  • 在SQL Management Studio中的数据不会被截断和俄罗斯的符号正确显示出来。
  • 我们有Windows 2003企业版SP2

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

回答

2

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

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

0

我一直都在使用utf8_general_ci的最好运气 - 用于连接,整理 - 所有东西。

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

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

祝你好运!

+0

感谢您的答复,但问题是definetely在PHP/PDO - 因为当我们连接到同一个数据库中.NET,一切工作正常。 – 2008-10-08 06:15:40

0

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

0

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

1

我不得不这样做是为了获得在MSSQL从我NVARCHAR领域可用数据:

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