SQL Server 2008数据库+ PHP中的UTF-8

Ste*_*fan 3 php sql database utf-8

我想在MS SQL 2008数据库中使用PHP存储数据.

我遇到像äöüß这样的字母有问题,它们在数据库中显示不正确,当我在网站上显示时.

当我对输入数据进行utf8_encode和使用PHP输出数据时的utf8_decode时,它可以正常工作.

还有其他更简单的方法来解决这个问题吗?

cyp*_*her 5

我已经解决了一次,问题是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测试了这个并且它运行得很好,我有一些大型网站正在运行,没有任何问题.