我已经解决了一次,问题是PHP的mssql驱动程序坏了(无法找到bugs.php.net的链接,但它就在那里)并且当涉及nchar和nvarchar fieldsa和utf8时失败.您需要稍微转换数据和查询:
SELECT some_nvarchar_field FROM some_table
Run Code Online (Sandbox Code Playgroud)
首先,您需要将输出更改为二进制 - 这样它不会被破坏:
SELECT CONVERT(varbinary(MAX), some_nvarchar_field) FROM some_table;
Run Code Online (Sandbox Code Playgroud)
然后在PHP中,您需要将其转换为UTF-8,在那里您需要iconv扩展名
iconv('UTF-16LE', 'UTF-8', $result['some_nvarchar_field']);
Run Code Online (Sandbox Code Playgroud)
从这个数据库修复selectiong数据,但是,如果你想真正把一些数据到数据库中,或添加一个WHERE条款,你仍然可以得到错误,所以对于修复WHERE,UPDATE,INSERT等是由字符串转换为十六进制form:
想象一下你有这个查询:
INSERT INTO some_table (some_nvarchar_field) VALUES ('Ž???ÝÁÖ');
Run Code Online (Sandbox Code Playgroud)
现在,我们必须运行一些PHP:
$value = 'Ž???ÝÁÖ';
$value = iconv('UTF-8', 'UTF-16LE', $value); //convert into native encoding
$value = bin2hex($value); //convert into hexadecimal
$query = 'INSERT INTO some_table (some_nvarchar_field) VALUES(CONVERT(nvarchar(MAX), 0x'.$value.'))';
Run Code Online (Sandbox Code Playgroud)
查询变为:
INSERT INTO some_table (some_nvarchar_field) VALUES (CONVERT(nvarchar(MAX), 0x7d010c0158011a01dd00c100d600));
Run Code Online (Sandbox Code Playgroud)
这将有效!
我已经使用FreeTDS在Linux上使用MS SQL Server 2008测试了这个并且它运行得很好,我有一些大型网站正在运行,没有任何问题.