在我们的网络应用程序中,我们使用PHP5.2.6 + PDO连接到SQL Server 2005数据库并存储俄语文本。
数据库归类为Cyrillic_General_CI_AS
,表归类为Cyrillic_General_CI_AS
,列类型为NVARCHAR(MAX)
。
我们尝试使用以下两种方案连接到数据库,这两种方案都会导致不同的问题。
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个字节。
PDO odbc:
$dbh = new PDO ('odbc:DSN=myDSN;UID='.$mssql_login.';PWD='.$mssql_pwd);
在这种情况下,同一查询的结果显示完全没有截断的数据,但带有问号而不是俄语符号。
注意:
那么我们应该选择什么作为连接方法以及如何解决相应的问题?
答案 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中的最大字符时,它可以解决问题。