当前位置: 首页 > ops >正文

golang mysql 诊断之旅(2000万开房数据被曝光引发的血案)

最近由于某某漏洞原因,2000万开房数据被曝光,数据是csv格式,打开慢的要死,于是想把这2000w的开房数据导入mysql,然后用go写个简单的查询工具。


悲剧开始了:

第一步,下载 mysql模块,go get github.com/go-sql-driver/mysql,

第二步,写个小例子测试下

package mainimport ("database/sql" //这包一定要引用"encoding/json""fmt"                              //这个前面一章讲过_ "github.com/go-sql-driver/mysql" //这就是刚才下载的包
)// 定义一个结构体, 需要大写开头哦, 字段名也需要大写开头哦, 否则json模块会识别不了
// 结构体成员仅大写开头外界才能访问
type User struct {User     string `json:"user"`Password string `json:"password"`Host     string `json:"host"`
}// 一如既往的main方法
func main() {// 格式有点怪, @tcp 是指网络协议(难道支持udp?), 然后是域名和端口db, e := sql.Open("mysql", "root:@tcp(192.168.7.15:3306)/mysql?charset=utf8")if e != nil { //如果连接出错,e将不是nil的print("ERROR?")return}defer db.Close()// 提醒一句, 运行到这里, 并不代表数据库连接是完全OK的, 因为发送第一条SQL才会校验密码 汗~!rows, e := db.Query("select user,password,host from mysql.user")if e != nil {fmt.Printf("query error!!%v\n", e)return}if rows == nil {print("Rows is nil")return}fmt.Println("DB rows.Next")for rows.Next() { //跟java的ResultSet一样,需要先next读取user := new(User)// rows貌似只支持Scan方法 继续汗~! 当然,可以通过GetColumns()来得到字段顺序row_err := rows.Scan(&user.User, &user.Password, &user.Host)if row_err != nil {print("Row error!!")return}b, _ := json.Marshal(user)fmt.Println(string(b)) // 这里没有判断错误, 呵呵, 一般都不会有错吧}fmt.Println("Done")
}

结果一直报错:

	panic: runtime error: index out of rangegoroutine 1 [running]:github.com/go-sql-driver/mysql.readLengthEncodedInteger(0x10fb0037, 0x1, 0xfc9, 0x0, 0x0, ...)E:/go/src/github.com/go-sql-driver/mysql/utils.go:406 +0x3e8github.com/go-sql-driver/mysql.skipLengthEnodedString(0x10fb0037, 0x1, 0xfc9, 0x2, 0x0, ...)E:/go/src/github.com/go-sql-driver/mysql/utils.go:366 +0x38github.com/go-sql-driver/mysql.(*mysqlConn).readColumns(0x10f88230, 0x1, 0x10f86500, 0x1, 0x1, ...)E:/go/src/github.com/go-sql-driver/mysql/packets.go:482 +0x389github.com/go-sql-driver/mysql.(*mysqlConn).getSystemVar(0x10f88230, 0x530b88, 0x12, 0x0, 0x0, ...)E:/go/src/github.com/go-sql-driver/mysql/connection.go:228 +0x118github.com/go-sql-driver/mysql.(*mysqlDriver).Open(0x5f0bf4, 0x547aa8, 0x2f, 0x1, 0x10f9f900, ...)E:/go/src/github.com/go-sql-driver/mysql/driver.go:70 +0x2dedatabase/sql.(*DB).conn(0x10f85e40, 0x10f50228, 0xff014c, 0x5)C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/database/sql/sql.go:484 +0x15edatabase/sql.(*DB).query(0x10f85e40, 0x527b68, 0x8, 0x0, 0x0, ...)C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/database/sql/sql.go:708 +0x58database/sql.(*DB).Query(0x10f85e40, 0x527b68, 0x8, 0x0, 0x0, ...)C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist465310315/go/src/pkg/database/sql/sql.go:699 +0x6bmain.main()E:/go/src/testmysql/testmysql.go:54 
http://www.xdnf.cn/news/11073.html

相关文章:

  • eclipse下载地址
  • JSP中forward和redirect的区别
  • VSS使用方法详解
  • 编解码学习笔记(三):Mpeg系列——Mpeg 1和Mpeg 2
  • 如何优化百度搜索引擎?(10个技巧让你的网站更容易被搜索到)
  • Win8安装教程!笔记本用U盘安装Win8只需三步
  • rqnoj 495 化学课配制溶液
  • PPTV去广告-2(去广告补丁的制作-XP测试通过)
  • 常见JS类型转换的方法
  • 不能不读的管理学著作
  • Java Pattern和Matcher用法
  • 工作流-jbpm入门例子
  • 10个最受欢迎的HDR环境贴图下载站
  • 电脑技巧:台式机噪音非常大的几个原因以及解决办法
  • 关于labelme标注线粗细和节点大小问题
  • 钱小样经典语录
  • 【中科院】分子生物学-朱玉贤第四版-笔记-第7-8讲 翻译
  • mysql -a_mysqlda
  • Oracle 9i所有版本的最新下载地址(已验证!)
  • 职场实录:我在盛大的日子
  • 外贸网站显示不安全警告怎么办?消除网站不安全警告超全指南
  • 一个快播倒下去,千千万万个快播站起来
  • 设置导航标题颜色以及导航条背景色
  • 回归线
  • oracle数据库分层,Oracle数据仓库的分层管理器解决方案开发者网络Oracle
  • 关于WindowsMobile6.0 手机系统
  • 深入剖析ARP地址欺骗病毒原理及欺骗过程
  • PHP设置header出现警告headers already sent by (output started at......
  • C/C++ MessageBox() 弹窗的用法
  • 未来宝宝长相预测在线工具好用吗?揭秘宝宝美丽奥秘的工具