记使用go-sql-driver碰上的问题

要求改用代理连接数据库

我们一小游戏后台使用golang开发,数据库使用MYSQL,驱动使用go-sql-driver/mysql,一天,数据库那边要求,使用他们提供的数据库代理层。

代理不支持Prepare模式

切换为使用代理层之后,发现报下面的错误信息。

update table_xxx set id = ?, name = ? where id=?;; Error Prepare unsupported!

询问DBA那边得知,他们的代理不支持prepare这个用法。在排查自己的代码中,没有发现有使用prepare,最后跟代码发现在使用db.Exec(query, params)这些接口,如果带有参数,那么驱动那边将会使用prepared模式。该模式会使用到prepare语句。

得知问题之后,改为plaintext的方式,直接拼好SQL之后,再调用db.Exec之后发现,有些数据写不进数据库。查日志发现报了SQL语法错误。

Plaintext模式要做转义

plaintext方式模式下,需要对字符串类的参数,做转义'\'的特别字符处理。这个处理在使用带参数的接口时,go-sql-driver/mysql会内部处理,但是使用plaintext方式,需要自己处理。因为MySQL使用'\'作为转义字符,没有设置sql_modeNO_BACKSLASH_ESCAPES