Oracle类Unix与Windows Server金属标签打印EOL换行异常求助
金属标识牌打印双行距问题排查求助
我维护一套用于打印金属标识牌(类似军用身份牌)的遗留系统。近期完成两项变更:将打印服务器升级至Windows Server 2019,同时把测试数据库服务器从Redhat Linux替换为HP Unix,之后出现了金属标识牌打印双行距的问题。
相关PL/SQL代码
注意代码里的换行符顺序是LF(chr(10))在前、CR(chr(13))在后,和常规顺序颠倒:
-- XONOFF starts with STX v_out := '<'; -- line #1 XONOFF needs only LF CR to seperate lines v_out := v_out || 'some data' || chr(10) || chr(13); -- line #2 XONOFF needs only LF CR to seperate lines v_out := v_out || 'some more data' || chr(10) || chr(13); -- XONOFF needs ETX at end of message and LF CR to help flush v_out := v_out || '>' || chr(10) || chr(13); utl_file.put(v_file, upper(v_out)); utl_file.fflush(v_file);
环境与测试限制
由于资源有限,测试环境和生产环境的链路如下:
- 生产环境:生产数据库服务器→生产打印服务器→生产打印机
- 测试环境:测试数据库服务器→生产打印服务器→生产打印机
最初推测问题根源:打印服务器升级到Windows Server 2019后,将代码里的LFCR识别为Linux风格换行符,自动转换为CRLF,最终输出变成CRLFCR,导致额外空行。临时解决方案是切回Windows Server 2012,但业务方强烈要求升级到2019。
今日协调测试时,先重启打印服务器到2019确认生产环境问题重现,随后在测试数据库服务器上测试修改后的代码(将LFCR替换为CRLF),预期问题会出现,但测试结果完全正常,测试计划受阻。
已测试的环境组合结果
唯一差异是测试DB为Redhat RHEL 7.9,生产DB为HP Unix,测试组合及结果:
- 测试DB(Redhat RHEL 7.9) + 打印服务器(Win 2012):打印正常
- 测试DB(Redhat RHEL 7.9) + 打印服务器(Win 2019):打印正常
- 生产DB(HP Unix) + 打印服务器(Win 2012):打印正常
- 生产DB(HP Unix) + 打印服务器(Win 2019):打印双行距
当前困境与疑问
我们最终目标是将打印服务器升级到2019,同时计划把生产DB换成Redhat,理论上能解决问题,但不确定根源。我认为调整代码中的EOL序列可以解决问题,但无法在测试环境复现问题,也不能在生产环境修改代码测试。
求问:
- 该问题的可能原因是什么?
- 有哪些排查建议?
- 代码里提到的XON/XOFF机制相关的问题,是否和当前打印异常有关?
内容的提问来源于stack exchange,提问作者Kmus
相关产品推荐
相关产品推荐

