Go sql语句引号问题

Posted 翔云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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‘)





以上是关于Go sql语句引号问题的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句中有关单引号双引号和加号的问题

sql语句中双引号添加的问题

一个sql存储过程中@sql语句加入引号的问题

mysql+php程序中sql语句中的引号使用方法,啥时候用双引号啥时候用单引号

SQL Select 语句的用法

sql语句中,如何表示单引号