mysql中的单双引号

        今天偶然查看远程服务器日志,在日志中出现一连串的相关错误。错误的关键点就在"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(")");
		}
        花了接近一个小时处理了这个问题,然后觉得这个很有代表性,就发这篇博客记录下来。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值