PHP5到PHP7升级导致SQL Server数据库中出现编码问题
我们有一个PHP5.6网站项目,我们将在PHP7.4上重新启动它 让我们称之为旧环境和新环境。旧的还完好无损。两者都在不同的服务器上 字符集(html元标记)设置为utf-8 Zend Framework 1涉及这两个方面。数据库位于SQL Server上,由两个环境共享。我们使用SqlSrv驱动程序连接到数据库(新环境),旧环境有PDO Sql 数据库的编码设置为PHP5到PHP7升级导致SQL Server数据库中出现编码问题,php,sql-server,zend-framework,character-encoding,sqlsrv,Php,Sql Server,Zend Framework,Character Encoding,Sqlsrv,我们有一个PHP5.6网站项目,我们将在PHP7.4上重新启动它 让我们称之为旧环境和新环境。旧的还完好无损。两者都在不同的服务器上 字符集(html元标记)设置为utf-8 Zend Framework 1涉及这两个方面。数据库位于SQL Server上,由两个环境共享。我们使用SqlSrv驱动程序连接到数据库(新环境),旧环境有PDO Sql 数据库的编码设置为Latin1\u General\u CI\u AS 在许多表中插入和选择信息(插入、选择)。Html文本字段和 文本区域正在使用中
Latin1\u General\u CI\u AS
在许多表中插入和选择信息(插入、选择)。Html文本字段和
文本区域正在使用中
在旧环境中,使用特殊字符(如umlauts)在textfields/-区域中写入的任何文本都将以损坏的形式保存在数据库中,如数据库表中的“而不是”。然而,在屏幕上,在select语句之后,它显示为ö(clean!)
到现在为止一切都还可以,但现在我们有了新的环境
假设在旧环境时代保存了一些旧条目,我们在新环境中打开网站。内容以1:1的比例显示在数据库表中,换句话说:已损坏。这解释了为什么在新环境的帮助下保存的任何内容都会正确显示在屏幕上,因为特殊字符和UMLAUT在保存时不会对数据库表进行任何更改
但在旧环境网站上看不到使用新环境制作的条目
使用utf8\u编码
或utf8\u解码
没有多大帮助,或者看起来更糟,或者屏幕上也看不到任何文本
编写一些脚本来更改表中的编码可能会造成混乱,因为旧环境仍然在使用,所以不可能那么容易做到
选项中没有提到编码选项,这些选项用于名为Zend\u Db\u Adapter\u Sqlsrv
的类
嗯,我不相信mb_detect_编码,但是我们尝试了,但是它在表中返回的值上返回了UTF-8
那么人们会推荐什么呢?我可能遗漏了一些事实,但如果需要,我会向您提供更多信息。这听起来与我过去解决的问题非常相似。不幸的是,我在ASP.NET中解决了这个问题,所以我只能描述我所做的工作,并让您将其转换为PHP 因此,问题可能是因为旧系统使用的是非UTF-8代码页,在我的例子中,代码页是
windows-1252
,这在当时相当普遍。代码页确定代码使用的字符编码
因此,在我更现代的系统上,我所要做的就是在我从数据库读取时强制代码页返回到windows-1252
。然后在呈现页面之前,将内容编码设置为UTF-8
因此,除非您能够从源头上解决问题,否则您基本上必须对新系统进行黑客攻击,以继续以相同的方式运行-这是一种不幸,但有时是必要的
ASP.NET代码如下所示:
protected void Page_Load(object Sender, EventArgs Args)
{
// Set the encoding for building and rendering, then switch later to display as utf-8
Response.Charset = "windows-1252"; // Hmmm... double check this
Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1252");
}
protected void Render(HtmlTextWriter writer)
{
// Now that all the character encoding has taken place, switch to utf-8 to force it to display this way...
Response.Charset = "utf-8";
Response.ContentEncoding = Encoding.UTF8;
}
希望这能给你足够的时间继续下去。。。我已经很久没有这样做了,但是疼痛仍然留在我的脑海里 因为这是其他人做的项目,我们决定更新所有表并更正值。真正的问题是,尽管知道它正在发生,但您以前没有修复它。显然,最好的方法是在数据库中使用UTF-8。