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')

  • 相关阅读:
    4.Windows下安装ZooKeeper
    3. ZAB与Paxos算法的联系与区别。
    2. ZooKeeper的ZAB协议。
    1. 初识ZooKeeper。
    27. Spring Boot 部署与服务配置
    26.SpringBoot事务注解详解
    25.Spring @Transactional工作原理
    24. Spring Boot 事务的使用
    罗辑思维CEO李天田:我们是这样玩儿公司的
    mysql中char,varchar与text类型的区别和选用
  • 原文地址:https://www.cnblogs.com/lanyangsh/p/8727078.html
Copyright © 2011-2022 走看看