今天偶然查看远程服务器日志,在日志中出现一连串的相关错误。错误的关键点就在"HomeStyles ... stilvoll leben"“,”......“,"......"
这个是我传入存储过程的一个参数。问题就来了,这里多了一个双引号,OH FUCK!原来还真有人这么命名的,这种...(省略1W字吐槽),但是既然有人这么命名,没办法就要想办法兼容。现在这个产品中,为了便于代码管理,我把一部分复杂的逻辑转移到代码中,存储过程精简了一些,因此,这里的处理方法是在传入参数之前,即在java代码中。(关于单引号之前已经考虑过,因为老外可能说什么的什么 sth‘s sth这种结构)
想法第一步:既然双引号不兼容,就用用单引号来把传参:
StringBuilder builder = new StringBuilder();
Pattern pattern = Pattern.compile("\"");
Matcher matcher = pattern.matcher(appName);
if (!matcher.find(0)) {
builder.append("call client_classify_insertWebapp(\"");
builder.append(appName);
builder.append("\",\"");
builder.append(pkgName);
builder.append("\",\"");
builder.append(userUUID);
builder.append("\",");
builder.append(isBuiltIn);
builder.append(",");
builder.append(deviceId);
builder.append(")");
} else {
builder.append("call client_classify_insertWebapp('");
builder.append(appName);
builder.append("','");
builder.append(pkgName);
builder.append("','");
builder.append(userUUID);
builder.append("',");
builder.append(isBuiltIn);
builder.append(",");
builder.append(deviceId);
builder.append(")");
}
但是,我觉得还有问题。因为双引号如果出现两个是不是会被作为字符串导致传参出错呢?这个是必然的。因此想法一不能够完全解决问题。
想法二:
我立刻觉得这里应该转义。
在mysql中双引号的转义是"" (两个双引),单引号是''(两个单引)。
我舍弃了判断,作为一个标准的java程序员,我当然会使用双引号作为传参的引号。
因此出现了第二个问题在双引号中"..........""...."双引号不能使用""的转义方法。这简直是不可理喻。
左右思量,尝试在单引号中使用单引号转义等等测试后。
想法三:只有单引号的根据以前的做(使用双引号来区分),有双引号的使用单引号区分参数,然后对其中的单双引号进行转义。
StringBuilder builder = new StringBuilder();
Pattern pattern = Pattern.compile("\"");
Matcher matcher = pattern.matcher(appName);
if (!matcher.find(0)) {
builder.append("call client_classify_insertWebapp(\"");
builder.append(appName);
builder.append("\",\"");
builder.append(pkgName);
builder.append("\",\"");
builder.append(userUUID);
builder.append("\",");
builder.append(isBuiltIn);
builder.append(",");
builder.append(deviceId);
builder.append(")");
} else {
appName = appName.replace("\"", "\"\"");
appName = appName.replace("\'", "\'\'");
builder.append("call client_classify_insertWebapp('");
builder.append(appName);
builder.append("','");
builder.append(pkgName);
builder.append("','");
builder.append(userUUID);
builder.append("',");
builder.append(isBuiltIn);
builder.append(",");
builder.append(deviceId);
builder.append(")");
}
花了接近一个小时处理了这个问题,然后觉得这个很有代表性,就发这篇博客记录下来。