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

3

我希望使用PHP将数据存储在MS SQL 2008数据库中。

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

当我使用PHP对输入的数据进行utf8_encode编码,并对输出的数据进行utf8_decode解码时,它可以正常工作。

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


你的数据库使用什么编码?当你接收到文本时,它是什么编码? - deceze
啊,我说错了,只有我直接输入到数据库中的单词才显示错误。当我用PHP保存数据时,在数据库中它看起来像这样asdasdasdääpöüööä0ß,但是当我用PHP从数据库中获取它时,它会正确地显示。 - Stefan
utf8_encode|decode 函数用于转换 ISO-8859-1 编码格式到 Unicode 或从 Unicode 转换到 ISO-8859-1,这有点违背使用 Unicode 的初衷。 - Álvaro González
我找不到好的解决方案,所以我只是将网站的字符集更改为ISO-8859-1,现在一切都很好。 ;) - Stefan
3个回答

5

我曾经解决过这个问题,问题在于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子句,你仍然会遇到错误,所以解决WHEREUPDATEINSERT等问题的方法是将字符串转换为十六进制形式:
假设你有这个查询:

INSERT INTO some_table (some_nvarchar_field) VALUES ('ŽČŘĚÝÁÖ');

现在,我们需要运行一些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.'))'; 

查询变成了这样:
INSERT INTO some_table (some_nvarchar_field) VALUES (CONVERT(nvarchar(MAX), 0x7d010c0158011a01dd00c100d600));

这会起作用

我已经使用FreeTDS在Linux上测试过MS SQL Server 2008,一切都很好,我有一些庞大的网站正在此上运行,没有任何问题。


或者,你知道的,当我再次阅读你的问题时,那可能是一个更简单的问题 :-) - cypher
嗯,我认为这比仅编码和解码要多一点工作吧? ;D 不过谢谢。 - Stefan
就像我之前写的那样,这可能是解决完全不同问题的一个解决方案,我一开始可能误读了你的问题 :-) - cypher
有人知道在管理工作室中如何查看或更改SQL数据库的字符集吗? - Stefan
非常感谢您提供的“如何编写值”!您的“select”无法正常工作,这里提供一个可行的替代方法:http://davidwalsh.name/php-odbc-nvarchar (SELECT CAST(CAST([field] AS VARCHAR(8000)) AS TEXT))。我使用了您的选择和编写方式,一切运行良好 :) 谢谢! - OZ_

0

我搜索了两天如何通过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);

根据这个讨论,N字符告诉服务器要转换为Unicode。 https://softwareengineering.stackexchange.com/questions/155859/why-do-we-need-to-put-n-before-strings-in-microsoft-sql-server

-1

我可以通过代码插入

    $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);

如果我不能搜索


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接