为什么此SQL插入在某些字符上使用循环中断?

为什么此SQL插入在某些字符上使用循环中断?,sql,oracle,bash,csv,Sql,Oracle,Bash,Csv,我使用脚本中的循环将行插入数据库,但当客户名称包含某些字符时,它会中断 数据 '1' 'Some+Customer Limited' 'email@somecustomerlimited.com' 期待 $a = '1' $b = 'Some+Customer Limited' $c = 'email@somecustomerlimited.com' INSERT INTO t1 (c1, c2, c3, c4, c5, c6) VALUES ($a, 1, $c, $c, 0, 0);

我使用脚本中的循环将行插入数据库,但当客户名称包含某些字符时,它会中断

数据

'1' 'Some+Customer Limited' 'email@somecustomerlimited.com'
期待

$a = '1'
$b = 'Some+Customer Limited'
$c = 'email@somecustomerlimited.com'

INSERT INTO t1 (c1, c2, c3, c4, c5, c6) VALUES ($a, 1, $c, $c, 0, 0);
错误

INSERT INTO t1 (c1, c2, c3, c4, c5, c6) VALUES ('1', 1, 'Some+Customer, Limited' 'email@domain.com', 0, 0)
                                                                                                                                 *
ERROR at line 1:
ORA-00917: missing comma

正如您在上面看到的,脚本中没有缺少逗号,即
值($a,1,$c,$c,0,0)。这是因为客户名称中的空格,还是客户名称中的
+
造成的?

我认为问题在于
read
在空格上拆分(实际上是$IFS中包含的任何字符),而不考虑引号

因此,不是:

$a = '1'
$b = 'Some+Customer Limited'
$c = 'email@somecustomerlimited.com'
你有:

$a = "'1'"
$b = "'Some+Customer"
$c = "Limited' 'email@somecustomerlimited.com'"

据我所知,无法在正则表达式上使
读取
“quote aware”或拆分,您必须选择一个特殊字符来分隔CSV的字段

正确的CSV解析器可以处理非逗号分隔符,假设字段被正确引用:

ruby -rcsv -ne '
    row = CSV.parse_line($_, {:col_sep => " ", :quote_char => 39.chr})
    p row
' <<END
'1' 'Some+Customer Limited' 'email@somecustomerlimited.com'
END

CSV中的“C”代表“逗号”。您的“CSV”中没有一个逗号。不,这是因为…Limited'和'email@...@马丁克。在脚本中,这个逗号是存在的(
值(
),而不是在脚本运行时出现的,因此出现了一个问题。我在这里看到了SQL注入孔。这与
bash
csv
有什么关系?谢谢您的回答,但最简单的解决方案是什么?目前数据类似于
'1''一些+客户有限公司'email@somecustomerlimited.com“
,是否应将数据更改为另一种格式?这与其说是一种可靠的解决方案,不如说是一种变通方法,但如果您确定数据不包含某些字符,请说“|”,您可以将其用作分隔符,例如1 |“Some+Customer Limited”|email@somecustomerlimited.com'然后将其设置为IFS:export IFS=“|”
["1", "Some+Customer Limited", "email@somecustomerlimited.com"]