当我尝试使用PHP插入非拉丁字符(例如希伯来语,阿拉伯语等,使用N'string插入')时,我发生了一件非常奇怪的事情。我尝试过的所有扩展都会发生这种情况:mssql,odbc和本机驱动程序。
当通过PHP代码插入时,只有通过PHP选择它才能正常工作,我可以阅读我插入的内容。在查询分析器中,字符串看起来很乱,C ++代码也会收到乱码。
通过查询分析器插入时,它在分析器和C ++代码中看起来不错,但是当使用PHP选择它时,我会得到问号而不是字符串。
答案 0 :(得分:1)
您无法正确控制连接排序规则。在开始处理数据之前通过发送正确的查询来设置它,或者在配置文件中更改它(我假设您使用的排序规则是UTF的形式)。
我不确定是否将其转换为MsSQL,但在MySQL中,查询是:
SET NAMES 'utf8';
SET CHARACTER SET 'utf8';
并且有匹配的配置属性可以永久设置它。
答案 1 :(得分:1)
这可能是由于以下两个问题之一:您的数据库/表/列使用的字符集中您尝试插入的字符未知。在你的情况下,我建议使用UTF-8(除非你主要使用非拉丁字符,否则UTF-16将是首选)。如果您完全确定您的数据库能够存储这些字符,那么也可能是连接设置不正确(可以将数据库连接设置为使用与数据库使用的字符集不同的字符集)。 / p>
另一个问题是PHP没有Unicode支持。因此,如果您尝试插入的字符嵌入在PHP源文件中,或者如果您在执行它之前在查询上应用字符串函数,那么PHP可能已经破坏了原始字符串。幸运的是,PHP具有支持Unicode字符的各种功能,因此您可以使用它们。你可以在这里找到一些:
答案 2 :(得分:1)
我们还尝试了所有可用的方法,并找到了两个处理NVARCHAR字段中的unicode数据的工作解决方案。不幸的是,SQL Server Driver for PHP仍然存在一些错误并且很难使用,因为您必须从UTF-16LE手动转换类似NVARCHAR的字段。 Zend Framework 1.9.0中有支持,但我还没有看过它。
目前,从PHP访问SQL Server的最佳方式似乎是使用COM和OLEDB:
$conn = new COM('ADODB.Connection', null, 65001);
$conn->Open('Provider=SQLNCLI;Server=SERVER;Database=DB;Uid=USER;Pwd=PASS');
$rs = $conn->Execute('SELECT nvarcharfield FROM sometable');
while (!$rs->EOF) {
echo $rs->Fields('nvarcharfield')->value, "\n";
$rs->MoveNext();
}
$rs->Close();
“65001”表示该组件应该以UTF-8模式工作,这可能是你想要的。因此,所有输入和输出的数据都将采用UTF-8编码。
如果准备好的查询使用COM进行编程并不复杂,那么这将是很好的,因此您可能希望查看ADOdb for PHP。然后代码略有不同:
$conn = NewADOConnection('ado_mssql');
$conn->charPage = 65001;
$conn->Connect('Provider=SQLNCLI;Server=SERVER;Database=DB;Uid=USER;Pwd=PASS');
$conn->SetFetchMode('ADODB_FETCH_ASSOC');
$rs = $conn->Execute('SELECT nvarcharfield FROM sometable');
while (!$rs->EOF) {
echo $rs->fields['nvarcharfield'], "\n";
$rs->MoveNext();
}
$rs->Close();
使用ADOdb,ADOdb中准备好的查询更容易编写和理解。
如果您有来自SQL Server 2008的新SQL Native Client,则可能需要将提供程序“SQLNCLI”替换为“SQLNCLI10”。
只要我获得一些声誉,我就会立即添加内联链接(新用户只允许一个超链接)。
http://devzone.zend.com/article/4906-Zend-Framework-1.9.0-Released
http://msdn.microsoft.com/de-de/library/system.data.oledb.oledbcommand.prepare.aspx
http://adodb.sourceforge.net/
http://phplens.com/lens/adodb/docs-adodb.htm#prepare