php应用程序和ms sql server中的区域字符(抛光)问题

时间:2010-09-15 15:50:37

标签: php sql-server sql-server-2005 unicode

我遇到插入MS SQL Server数据库的区域字符串字符的问题。

有一个PHP应用程序连接mssql服务器并插入一些数据。但不是插入如下字符:±,Ą,ć,Ł,ź(等等 - 顺便说一句,这些是波兰的区域字符),当插入mssql表时,它们显示为 a ,A,c,L,z

以下是一些背景资料:

  • 我使用freetds驱动程序进行mssql连接
  • 列类型为nvarchar(MAX)
  • 我查看了发送“trough wire”(使用WireShark)的数据,并且UTF-8编码数据看起来没问题,例如Ą以U + 0104的形式发送。
  • 将相同的字符串插入本地数据库实例(Microsoft SQL Server Express Edition)时,它可以正常工作,但在远程主机上(在客户位置 - 它是Microsoft SQL Server Standard Edition 64位),会发生这种“去区域化”。

好像这个远程mssql服务器没有处理php应用程序发送的这个输入数据。任何人都可以看到/知道这里有什么问题吗?

2 个答案:

答案 0 :(得分:1)

也许是一个新手的错误,但我根据KB #239530找到了这个问题的根源:

  

“当SQL Server将没有N前缀的Unicode字符串从Unicode转换为SQL Server数据库的代码页时,Unicode字符串中SQL Server代码页中不存在的任何字符都将丢失。”

我认为sqlserver的本地实例以某种方式将所有传入的字符串文字视为Unicode字符串而远程服务器不会,因此需要N前缀。

答案 1 :(得分:0)

您可以使用此解决方法,在插入数据库之前使用htmlentities函数,并在从数据库检索数据后使用html_entity_decode函数。您可以使用ISO-8859-2Windows-1250字符集。