zoukankan      html  css  js  c++  java
  • Go sql语句引号问题

    使用Go进行Mysql开发时,会遇到引号问题(实际上,与语言无关,只要使用sql就会遇到这些类似问题)。

    本文举例说明如何解决这些问题。

    Example1

    第一例子演示格式字符是否要加引号。

    代码如下:

    detailMsg := "abc"
    
    sql := fmt.Sprintf(
       "insert into tbl_log(ip, name, detail_msg) values ('%s', '%s', %s)",
        "1.1.0.1",
         "test.py",
         detailMsg,
    )
    fmt.Println("sql: ", sql)
    

    output:

    2018/04/05 17:40:00 sql: insert into tbl_log(ip, name, detail_msg) values ('1.1.0.1', 'test.py', abc)
    2018/04/05 17:40:00 exec failed: Error 1054: Unknown column 'abc' in 'field list' , sql: insert into tbl_log(ip, name, detail_msg) values ('1.1.0.1', 'test.py', abc)

    如果字段类型是字符串,格式化字符需要加上两个单引号,也就是格式字符%s改为'%s' .

    正确示例

    detailMsg := "abc"
    sql := fmt.Sprintf(
             "insert into tbl _log(ip, name, detail_msg) values ('%s', '%s', '%s')",
              "1.1.0.1",
              "test.py",
              detailMsg,
            )
    
    fmt.Println("sql: ", sql)
    

    output

    sql: insert into tbl_log(ip, name, detail_msg) values ('1.1.0.1', 'test.py', 'abc')

    Example2

    如果插入的内容中包含单引号,例子如下。

    也就是detailMsg中如果有单引号。

    detailMsg := "ab'c"
    fmt.Println("detailMsg: ", detailMsg)
    sql := fmt.Sprintf(
             "insert into tbl_log(ip, name, detail_msg) values ('%s', '%s', '%s')",
              "1.1.0.1",
              "test.py",
              detailMsg,
            )
    
    fmt.Println("sql: ", sql)
    

    output

    2018/04/05 17:45:03 detailMsg: ab'c
    2018/04/05 17:45:03 sql: insert into tbl _log(ip, name, detail_msg) values ('1.1.0.1', 'test.py', 'ab'c')
    2018/04/05 17:45:03 exec failed: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'c')' at line 1 , sql: insert into tbl_log(ip, name, detail_msg) values ('1.1.0.1', 'test.py', 'ab'c')

    解决办法

    对内容中的单引号进行转义 '.

    detailMsg:= "ab'c"
    detailMsg = strings.Replace(detailMsg, "'", "\'", -1)
    log.Println("detailMsg:", detailMsg)
    
    
    sql := fmt.Sprintf(
      "insert into tbl_log(ip, name, detail_msg) values ('%s', '%s', '%s')",
       "1.1.0.1",
       "test.py",
       detailMsg,
    )
    
    log.Println("sql:", sql)
    

    output:

    2018/04/05 17:48:11 detailMsg: ab'c
    2018/04/05 17:48:11 sql: insert into tbl_log(ip, name, detail_msg) values ('1.1.0.1', 'test.py', 'ab'c')

  • 相关阅读:
    计算机网络中的码元的理解
    屏幕扩展,屏幕相对位置的设置
    wireshark使用入门
    Http下载文件的登录验证
    正则-连续相同的单词
    文件系统和数据库索引用B树而不是红黑树的原因
    红黑树的突破点
    Win 10 Revit 2019 安装过程,亲自踩的一遍坑,有你想要的细节
    Java拦截器的实现原理
    根据进程数,资源数判断是否发生死锁
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/8727078.html
Copyright © 2011-2022 走看看