如何解决Zend Framework 将表情符号保存为 SQL 表中的问号
我们(仍在)使用 ZF1 来写入/读取 Microsoft SQL 数据库。
只要表格字段是 NVARCHAR 类型,一切都很好,特殊字符(如中文、波兰语等)和表情符号都可以正确保存,1:1 等于以 html 形式输入的文本。
但是当涉及到列类型 TEXT 时,这些列中有问号而不是特殊字符/表情符号。
有趣的是,在我们运行 PHP5.6 的服务器上一切正常,并且安装了 FreeTDS 和 php-mssql。这个问题出现在安装了PHP7.4的系统上,只使用SQLSRV作为db驱动。
根据this thread,一个简单的N
应该就足够了……只要将字段设置为NVARCHAR 字段即可。我们正在使用 Zend Framework 的更新和插入方法,所以我们不知道如何将所有这些字符保存到 TEXT 列中。
连接时,我们的引导文件使用 UTF-8 作为字符集,用作驱动程序选项。
是否有任何解决方法可以尝试完成此操作?我们无法更改列类型,因为某些列是 TEXT 是有原因的。
解决方法
你为什么使用text
?它 (text
) 已被弃用 16 年。但是,text
不支持 unicode 字符,应该是 ntext
;但这也已被弃用 16 年。
要存储最多 2GB 的字符,需要是 unicode,请使用 nvarchar(MAX)
。对于已经存在的列,ALTER
它。
ALTER TABLE dbo.YourTable ALTER COLUMN YourColumn nvarchar(MAX);
,
根据 OP response in the comments,数据库设置可以放在一边,因为 TEXT
列类型在使用 PHP 5.6 时表现符合预期,并且在使用 PHP 7.4 时在同一数据库上操作失败。>
这允许将问题缩小到运行时 PHP 字符集处理。不知道从 PHP 5.6 升级到 7.4 之间的所有细节,问题可能在于:
- php.ini 中不同的默认字符集
- 使用字符集处理的 mssql 驱动程序中的不同行为
- 可能影响脚本的不同操作系统默认语言环境
- 不同的 php 文件编码(.php 文件本身的编码可能会改变运行时使用的字符集)
由于无法根据所提供的信息明确确定手头的问题,我只能建议您逐一检查并排除各种可能性。
- 尝试使用任何
mb_*
函数(可能参考 this question)检测输入文本的实际编码 - 尝试在包含特殊字符的脚本文件中添加注释,并确保将文件保存为 UTF8(或所需编码)
- 尝试明确设置驱动程序字符集(请参阅 this question)(或者可能在连接字符串中,如果支持)
- 尝试使用
setlocale
和其他同类函数设置默认的 php 语言环境
这些步骤可能会引导您完成解决方案,但没有保证。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。