我希望使用PHP将数据存储在MS SQL 2008数据库中。
我遇到了像ä ö ü ß这样的字母问题,它们在数据库中和网站上显示不正确。
当我使用PHP对输入的数据进行utf8_encode编码,并对输出的数据进行utf8_decode解码时,它可以正常工作。
是否有其他更简单的方法来解决这个问题?
我希望使用PHP将数据存储在MS SQL 2008数据库中。
我遇到了像ä ö ü ß这样的字母问题,它们在数据库中和网站上显示不正确。
当我使用PHP对输入的数据进行utf8_encode编码,并对输出的数据进行utf8_decode解码时,它可以正常工作。
是否有其他更简单的方法来解决这个问题?
我曾经解决过这个问题,问题在于PHP的mssql驱动程序有缺陷(无法找到bugs.php.net的链接,但它确实存在),并且在涉及nchar和nvarchar字段以及utf8时会失败。您需要稍微转换一下数据和查询:
SELECT some_nvarchar_field FROM some_table
首先,您需要将输出更改为二进制格式 - 这样就不会损坏:
SELECT CONVERT(varbinary(MAX), some_nvarchar_field) FROM some_table;
然后在PHP中,您需要将其转换回UTF-8,这里您需要使用iconv扩展
iconv('UTF-16LE', 'UTF-8', $result['some_nvarchar_field']);
这个修复了从数据库中选择数据的问题,但是如果你想要将一些数据放到数据库中,或者添加一个WHERE
子句,你仍然会遇到错误,所以解决WHERE
、UPDATE
、INSERT
等问题的方法是将字符串转换为十六进制形式:
假设你有这个查询:
INSERT INTO some_table (some_nvarchar_field) VALUES ('ŽČŘĚÝÁÖ');
$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.'))';
INSERT INTO some_table (some_nvarchar_field) VALUES (CONVERT(nvarchar(MAX), 0x7d010c0158011a01dd00c100d600));
这会起作用!
我已经使用FreeTDS在Linux上测试过MS SQL Server 2008,一切都很好,我有一些庞大的网站正在此上运行,没有任何问题。
SELECT CAST(CAST([field] AS VARCHAR(8000)) AS TEXT)
)。我使用了您的选择和编写方式,一切运行良好 :) 谢谢! - OZ_我搜索了两天如何通过PHP将UTF-8数据(来自Web表单)插入到MSSQL 2008中。我在各处都看到说你不能这样做,你需要先转换为UCS2(就像cypher的解决方案建议的那样)。
在Windows环境中,SQLSRV被认为是一个好的解决方案,但我无法尝试,因为我正在Mac OSX上开发。
然而,FreeTDS手册(PHP mssql在OSX上使用的)说要在开头引号前添加一个字母“N”:
mssql_query("INSERT INTO table (nvarcharField) VALUES (N'űáúőűá球最大的采购批发平台')", +xon);
我可以通过代码插入
$value = $_POST['first_name'];
$value = iconv("UTF-8","UCS-2LE",$value);
$value2 = $_POST['last_name'];
$value2 = iconv("UTF-8","UCS-2LE",$value2);
$query = "INSERT INTO tbl_sample(first_name, last_name) VALUES (CONVERT(VARBINARY(MAX), '".$value."') , CONVERT(VARBINARY(MAX), '".$value2."'))";
odbc_exec($connect, $query);
如果我不能搜索