SQL文件的BOM问题导致的invalid character错误及解决

最近在做数据的搬运工,将Oracle中的数据搬运到ES中,方案很成熟了,使用Logstash的jdbc-input执行SQL,然后将结果输出到ES中。这么简单的问题,在测试环境中测试也一帆风顺,可一上生产环境傻眼了,始终报“ORA-00911 invalid character”的错误。

困扰了好几天,测试环境一直没问题,生产环境不管用多么简单的SQL都出同样的问题。最后,认真看了一下日志,突然发现 feff是什么鬼?

有了这个线索,百度了一下,原来是文件的BOM头,忽然想起来SQL文件是在Windows下用记事本保存为UTF-8格式的。在Linux下重新创建了一个空白文件,将SQL语句拷贝过去,再执行就没问题了。

只能说,尽量还是不要用记事本啊~~

如何查看文件是否含有BOM头

file 命令

在Linux下,可以简单的使用file命令来查看文件是否含有BOM头。

[root@bj1eccap01 ~]# file test.txt
test.txt: UTF-8 Unicode (with BOM) text, with no line terminators

awk 命令

[root@bj1eccap01 ~]# hexdump test2.txt
0000000 bbef 48bf 6c65 6f6c 5720 726f 646c bcef
0000010 0d81 000a
0000013
[root@bj1eccap01 ~]# find . -type f -print0 | xargs -0r awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
./test2.txt

删除BOM头

sed 命令

[root@bj1eccap01 ~]# sed -i -e '1s/^\xEF\xBB\xBF//' test2.txt
[root@bj1eccap01 ~]# find . -type f -print0 | xargs -0r awk '/^\xEF\xBB\xBF/ {print FILENAME} {nextfile}'
[root@bj1eccap01 ~]# hexdump test2.txt
0000000 6548 6c6c 206f 6f57 6c72 ef64 81bc 0a0d
0000010

这个问题反过来想,我觉得是 logstash 不支持含有 BOM 头的SQL文件,是不是可以给官方提交一个Feature来解决这个问题?

本文为作者原创,如果您觉得本文对您有帮助,请随意打赏,您的支持将鼓励我继续创作。

参考资料:
1、带BOM的UTF-8
2、Byte order mark
3、How to check if file has a BOM in utf-8 text
4、Using awk/sed to detect/remove the byte order mark (BOM)

时间: 2024-10-06 01:31:47

SQL文件的BOM问题导致的invalid character错误及解决的相关文章

断电导致oracle的ORA-01207错误完全解决办法

硬件维护的时候有人不小心把生产库的电源断掉了,重新启动盘柜和服务器后,oracle 10g 10.2.0.4 startup时出现错误提示:  代码如下 复制代码 数据库装载完毕. ORA-01122: 数据库文件 1 验证失败 ORA-01110: 数据文件 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF' ORA-01207: 文件比控制文件更新 - 旧的控制文件 (file is more recent than control

sql server 2005-SQL Server 2005 创建数据库时报208错误如何解决

问题描述 SQL Server 2005 创建数据库时报208错误如何解决 创建 对于 数据库"a0718152616"失败. (Microsoft.SqlServer.Smo)执行 Transact-SQL 语句或批处理时发生了异常.(Microsoft.SqlServer.ConnectionInfo)Invalid object name 'ADDRESS'. (Microsoft SQL Server错误:208) 求高人指点如何解决!!! 详细信息如下: 创建 对于 数据库&

HHVM崩溃导致网站报502错误的解决方法

为了提高性能,之前把博客更换到了HHVM平台,性能确实提高了不少,但是偶尔会遇到502错误,重启HHVM之后就修复,目测是HHVM崩溃了.在网上找了一下,大多数处理思路都是建一个计划任务,在HHVM崩溃的时候重启,由于Linux Cron Job执行的最小时间单位是分,如果HHVM崩溃,最长的宕机时间不会超过一分钟,对普通博客而言,在可以接受的范围内,因此这个方法颇受欢迎.现在就将我尝试过的几种方法分享和大家分享一下: 网站报502错误的方法集锦   方法一:监测进程状态重启HHVM 保存以下s

查询英文表时正常,查询中文表时报ORA-00911: invalid character 错误

问题描述 PLSQL查询中文表.英文表都正常,VS2013或IIS下执行,英文表都正常显示,中文表报ORA-00911:invalidcharacter错误,求各位大神,帮看是什么问题!!! 解决方案 解决方案二:执行语句你不写出来谁知道你哪里出问题呢解决方案三:这个雷同,不知道能不能用http://bbs.csdn.net/topics/110132903解决方案四:这个雷同,不知道能不能用(上一个忘了加超链接,这个可以直接点击打开省复制了)解决方案五:分号的问题是引起这一错误的老牌原因了,但

Jquery跨域获得Json时invalid label错误的解决办法_jquery

最后,仔细安静下来,细读 json 官方文档后发现这么一段: JSON数据是一种能很方便通过JavaScript解析的结构化数据.如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型.使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面.服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求.如果要指定回调函数的参数名来取代默认的callback,可以通过设置$.ajax()的jsonp

SQL"不能为新插入的行确定标识"错误的解决方法

这种情况在Access下可以通过,但SQL则不行,在百度搜索解决方法,发现N多人出现同样问题却找不到解决办法: 复制代码 代码如下: set rs=server.CreateObject("adodb.recordset") rs.open "select * from t1",conn,1,3 rs.addnew() rs("data")="abc123" rs.update rs("data")=rs(

权限问题导致Nginx 403 Forbidden错误的解决方法_nginx

今天在一个新的环境上安装nginx,结果访问的都是403 通常显示403我立马都会想到路径配置不对,但我仔细看了一下,目录路径没问题: nginx.conf: 复制代码 代码如下: server {         listen       80;         server_name  localhost;           #charset koi8-r;           #access_log  logs/host.access.log  main;           locat

Mysql导入.sql文件出错

问题描述 Mysql导入.sql文件出错 mysql导入sql文件时老是提示错误,请问各位高手该怎么解决? 解决方案 那最长的串右侧没有单引号 '注意用括起来' 解决方案二: 单引号要成双成对.一一对应. 否则,SQL语句可能会因为错误的单引号导致语法错误. 解决方案三: 中文字符串后面缺少单引号 解决方案四: sql文件格式有问题,估计引号什么的被中文字符串影响了

ASP.NET调用.sql文件(二)

笔者前一阵子发表了一篇<ASP.NET调用.sql文件>文章,主要是是解决数据库配置,减去传统手工附加数据库和自己改写web.config文件等等这些复杂的过程,而是配置的向导.其中给出关键的技术知识点,就是通过sql数据库生成数据库脚本即.sql文件,然后通过调用osql.exe来执行.sql文件. 这里,园友首先质疑了其安全性,认为程序存在被他人利用的危险.笔者对这方面没有太多经验,希望来位高人讲讲这方面的知识或者演示被利用的过程.所以这块还是一个未知的领域,笔者也不敢保证绝对安全,但是至