go-sql-driver/mysql

GitHub: go-sql-driver/mysql

一个纯 Go 实现的轻量级 MySQL 驱动,为 Go 标准库 database/sql 提供 MySQL 和 MariaDB 的数据库连接能力。

Stars: 15277 | Forks: 2329

# Go-MySQL-Driver [![DeepWiki](https://img.shields.io/badge/DeepWiki-go--sql--driver%2Fmysql-blue.svg?logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAyCAYAAAAnWDnqAAAAAXNSR0IArs4c6QAAA05JREFUaEPtmUtyEzEQhtWTQyQLHNak2AB7ZnyXZMEjXMGeK/AIi+QuHrMnbChYY7MIh8g01fJoopFb0uhhEqqcbWTp06/uv1saEDv4O3n3dV60RfP947Mm9/SQc0ICFQgzfc4CYZoTPAswgSJCCUJUnAAoRHOAUOcATwbmVLWdGoH//PB8mnKqScAhsD0kYP3j/Yt5LPQe2KvcXmGvRHcDnpxfL2zOYJ1mFwrryWTz0advv1Ut4CJgf5uhDuDj5eUcAUoahrdY/56ebRWeraTjMt/00Sh3UDtjgHtQNHwcRGOC98BJEAEymycmYcWwOprTgcB6VZ5JK5TAJ+fXGLBm3FDAmn6oPPjR4rKCAoJCal2eAiQp2x0vxTPB3ALO2CRkwmDy5WohzBDwSEFKRwPbknEggCPB/imwrycgxX2NzoMCHhPkDwqYMr9tRcP5qNrMZHkVnOjRMWwLCcr8ohBVb1OMjxLwGCvjTikrsBOiA6fNyCrm8V1rP93iVPpwaE+gO0SsWmPiXB+jikdf6SizrT5qKasx5j8ABbHpFTx+vFXp9EnYQmLx02h1QTTrl6eDqxLnGjporxl3NL3agEvXdT0WmEost648sQOYAeJS9Q7bfUVoMGnjo4AZdUMQku50McDcMWcBPvr0SzbTAFDfvJqwLzgxwATnCgnp4wDl6Aa+Ax283gghmj+vj7feE2KBBRMW3FzOpLOADl0Isb5587h/U4gGvkt5v60Z1VLG8BhYjbzRwyQZemwAd6cCR5/XFWLYZRIMpX39AR0tjaGGiGzLVyhse5C9RKC6ai42ppWPKiBagOvaYk8lO7DajerabOZP46Lby5wKjw1HCRx7p9sVMOWGzb/vA1hwiWc6jm3MvQDTogQkiqIhJV0nBQBTU+3okKCFDy9WwferkHjtxib7t3xIUQtHxnIwtx4mpg26/HfwVNVDb4oI9RHmx5WGelRVlrtiw43zboCLaxv46AZeB3IlTkwouebTr1y2NjSpHz68WNFjHvupy3q8TFn3Hos2IAk4Ju5dCo8B3wP7VPr/FGaKiG+T+v+TQqIrOqMTL1VdWV1DdmcbO8KXBz6esmYWYKPwDL5b5FA1a0hwapHiom0r/cKaoqr+27/XcrS5UwSMbQAAAABJRU5ErkJggg==)](https://deepwiki.com/go-sql-driver/mysql) 一个用于 Go 语言 [database/sql](https://golang.org/pkg/database/sql/) 包的 MySQL 驱动 ![Go-MySQL-Driver logo](https://raw.github.com/wiki/go-sql-driver/mysql/gomysql_m.png "Golang Gopher holding the MySQL Dolphin") * [功能](#features) * [环境要求](#requirements) * [安装说明](#installation) * [用法](#usage) * [DSN (Data Source Name)](#dsn-data-source-name) * [密码](#password) * [协议](#protocol) * [地址](#address) * [参数](#parameters) * [示例](#examples) * [连接池和超时](#connection-pool-and-timeouts) * [context.Context 支持](#contextcontext-support) * [ColumnType 支持](#columntype-support) * [LOAD DATA LOCAL INFILE 支持](#load-data-local-infile-support) * [time.Time 支持](#timetime-support) * [Unicode 支持](#unicode-support) * [测试 / 开发](#testing--development) * [License](#license) ## 功能 * 轻量且[快速](https://github.com/go-sql-driver/sql-benchmark "golang MySQL-Driver performance") * 原生 Go 实现。没有 C 绑定,只有纯 Go * 通过 TCP/IPv4, TCP/IPv6, Unix domain sockets 或[自定义协议](https://godoc.org/github.com/go-sql-driver/mysql#DialFunc)建立连接 * 自动处理断开的连接 * 自动连接池 *(由 database/sql 包提供)* * 支持大于 16MB 的查询 * 完整的 [`sql.RawBytes`](https://golang.org/pkg/database/sql/#RawBytes) 支持。 * 在 prepared statements 中智能处理 `LONG DATA` * 安全的 `LOAD DATA LOCAL INFILE` 支持,具有文件白名单和 `io.Reader` 支持 * 可选的 `time.Time` 解析 * 可选的占位符插值 * 支持 zlib 压缩。 ## 环境要求 * Go 1.24 或更高版本。我们的目标是支持最新的 3 个 Go 版本。 * 维护者支持 MySQL (5.7+) 和 MariaDB (10.5+)。 * [TiDB](https://github.com/pingcap/tidb) 由 PingCAP 提供支持。 * 请勿在我们的 issue 跟踪器或论坛中询问有关 TiDB 的问题。 * [文档](https://docs.pingcap.com/tidb/v6.1/dev-guide-sample-application-golang) * [论坛](https://ask.pingcap.com/) * go-mysql 可与 Percona Server, Google CloudSQL 或 Sphinx (2.2.3+) 配合使用。 * 维护者不会为它们提供支持。不要期望维护者调查并解决相关问题。 * 请自行调查问题并提交 pull request 来修复它。 ## 安装说明 在 shell 中使用 [go 工具](https://golang.org/cmd/go/ "go command") 将包简单安装到您的 [$GOPATH](https://github.com/golang/go/wiki/GOPATH "GOPATH"): ``` go get -u github.com/go-sql-driver/mysql ``` 确保您的机器上[已安装 Git](https://git-scm.com/downloads),并且已添加到系统的 `PATH` 中。 ## 用法 _Go MySQL Driver_ 是 Go 的 `database/sql/driver` 接口的一个实现。您只需要导入该驱动,就可以使用完整的 [`database/sql`](https://golang.org/pkg/database/sql/) API 了。 使用 `mysql` 作为 `driverName`,并使用有效的 [DSN](#dsn-data-source-name) 作为 `dataSourceName`: ``` import ( "database/sql" "time" _ "github.com/go-sql-driver/mysql" ) // ... db, err := sql.Open("mysql", "user:password@/dbname") if err != nil { panic(err) } // See "Important settings" section. db.SetConnMaxLifetime(time.Minute * 3) db.SetMaxOpenConns(10) db.SetMaxIdleConns(10) ``` [我们的 Wiki 中提供了示例](https://github.com/go-sql-driver/mysql/wiki/Examples "Go-MySQL-Driver Examples")。 ### 重要设置 必须使用 `db.SetConnMaxLifetime()` 以确保连接在被 MySQL 服务器、操作系统或其他中间件关闭之前,由驱动程序安全地关闭。由于某些中间件会在 5 分钟后关闭空闲连接,我们建议将超时时间设置为少于 5 分钟。此设置还有助于负载均衡和更改系统变量。 强烈建议使用 `db.SetMaxOpenConns()` 来限制应用程序使用的连接数。没有推荐的限制数量,因为它取决于应用程序和 MySQL 服务器。 建议将 `db.SetMaxIdleConns()` 设置为与 `db.SetMaxOpenConns()` 相同的值。当它小于 `SetMaxOpenConns()` 时,连接的打开和关闭频率可能会比您预期的要高得多。空闲连接可以通过 `db.SetConnMaxLifetime()` 关闭。如果您想更快速地关闭空闲连接,可以从 Go 1.15 开始使用 `db.SetConnMaxIdleTime()`。 ### DSN (Data Source Name) 数据源名称具有通用格式,例如 [PEAR DB](http://pear.php.net/manual/en/package.database.db.intro-dsn.php) 所使用的格式,但没有类型前缀(可选部分由方括号标记): ``` [username[:password]@][protocol[(address)]]/dbname[?param1=value1&...¶mN=valueN] ``` 完整形式的 DSN 如下: ``` username:password@protocol(address)/dbname?param=value ``` 除了数据库名称外,所有值都是可选的。因此最小的 DSN 是: ``` /dbname ``` 如果您不想预选数据库,请将 `dbname` 留空: ``` / ``` 这与空的 DSN 字符串效果相同: ``` ``` 自 v1.8.0 起,`dbname` 会通过 [PathEscape()](https://pkg.go.dev/net/url#PathEscape) 进行转义。如果您的数据库名称是 `dbname/withslash`,它将变为: ``` /dbname%2Fwithslash ``` 或者,也可以使用 [Config.FormatDSN](https://godoc.org/github.com/go-sql-driver/mysql#Config.FormatDSN) 通过填充结构体来创建 DSN 字符串。 #### 密码 密码可以由任何字符组成。**不需要**转义。 #### 协议 有关哪些网络可用的更多信息,请参见 [net.Dial](https://golang.org/pkg/net/#Dial)。 通常,如果可用,您应该使用 Unix domain socket,否则使用 TCP 以获得最佳性能。 #### 地址 对于 TCP 和 UDP 网络,地址的格式为 `host[:port]`。 如果省略 `port`,将使用默认端口。 如果 `host` 是字面 IPv6 地址,则必须将其括在方括号中。 函数 [net.JoinHostPort](https://golang.org/pkg/net/#JoinHostPort) 和 [net.SplitHostPort](https://golang.org/pkg/net/#SplitHostPort) 用于操作此格式的地址。 对于 Unix domain sockets,地址是 MySQL-Server-socket 的绝对路径,例如 `/var/run/mysqld/mysqld.sock` 或 `/tmp/mysql.sock`。 #### 参数 *参数区分大小写!* 请注意,任何 `true`、`TRUE`、`True` 或 `1` 都被接受为代表 true 布尔值。毫不意外,false 可以指定为以下任意一种:`false`、`FALSE`、`False` 或 `0`。 ##### `allowAllFiles` ``` Type: bool Valid Values: true, false Default: false ``` `allowAllFiles=true` 禁用 `LOAD DATA LOCAL INFILE` 的文件白名单,并允许*所有*文件。 [*可能不安全!*](https://dev.mysql.com/doc/refman/8.0/en/load-data.html#load-data-local) ##### `allowCleartextPasswords` ``` Type: bool Valid Values: true, false Default: false ``` `allowCleartextPasswords=true` 允许在账户需要时(例如使用 [PAM authentication plugin](http://dev.mysql.com/doc/en/pam-authentication-plugin.html) 定义的账户)使用 [cleartext client side plugin](https://dev.mysql.com/doc/en/cleartext-pluggable-authentication.html)。在某些配置下,以明文形式发送密码可能会导致安全问题。为了避免在密码有可能被拦截时出现问题,客户端应使用能够保护密码的方法连接到 MySQL 服务器。可行的方法包括 [TLS / SSL](#tls)、IPsec 或专用网络。 ##### `allowFallbackToPlaintext` ``` Type: bool Valid Values: true, false Default: false ``` `allowFallbackToPlaintext=true` 的作用类似于 [Command Options for Connecting to the Server](https://dev.mysql.com/doc/refman/5.7/en/connection-options.html#option_general_ssl-mode) 中描述的 `--ssl-mode=PREFERRED` MySQL 客户端 ##### `allowNativePasswords` ``` Type: bool Valid Values: true, false Default: true ``` `allowNativePasswords=false` 禁止使用 MySQL 原生密码方法。 ##### `allowOldPasswords` ``` Type: bool Valid Values: true, false Default: false ``` `allowOldPasswords=true` 允许使用不安全的旧密码方法。应尽量避免这种情况,但在某些情况下是必要的。另请参见 [the old_passwords wiki page](https://github.com/go-sql-driver/mysql/wiki/old_passwords)。 ##### `charset` ``` Type: string Valid Values: Default: none ``` 设置用于客户端-服务器交互的字符集(`"SET NAMES "`)。如果设置了多个字符集(以逗号分隔),则在设置字符集失败时将使用后面的字符集。例如,这允许支持 `utf8mb4`([在 MySQL 5.5.3 中引入](http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html)),并在面对旧服务器时回退到 `utf8`(`charset=utf8mb4,utf8`)。 另请参见 [Unicode 支持](#unicode-support)。 ##### `checkConnLiveness` ``` Type: bool Valid Values: true, false Default: true ``` 在受支持的平台上,从连接池中获取的连接在使用前会进行存活性检查。如果检查失败,相应的连接将被标记为坏,并使用另一个连接重试查询。 `checkConnLiveness=false` 禁用此连接存活性检查。 ##### `collation` ``` Type: string Valid Values: Default: utf8mb4_general_ci ``` 设置连接上用于客户端-服务器交互的 collation。与 `charset` 相比,`collation` 不会发出额外的查询。如果目标服务器上不可用指定的 collation,连接将失败。 可以使用 `SHOW COLLATION` 检索服务器有效的字符集列表。 默认的 collation(`utf8mb4_general_ci`)从 MySQL 5.5 开始支持。对于较旧的 MySQL,您应该使用较旧的 collation(例如 `utf8_general_ci`)。 字符集 "ucs2"、"utf16"、"utf16le" 和 "utf32" 的 collation 无法使用([ref](https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html#charset-connection-impermissible-client-charset))。 另请参见 [Unicode 支持](#unicode-support)。 ##### `clientFoundRows` ``` Type: bool Valid Values: true, false Default: false ``` `clientFoundRows=true` 使 UPDATE 返回匹配的行数而不是更改的行数。 ##### `columnsWithAlias` ``` Type: bool Valid Values: true, false Default: false ``` 当 `columnsWithAlias` 为 true 时,调用 `sql.Rows.Columns()` 将返回由点分隔的表别名和列名。例如: ``` SELECT u.id FROM users as u ``` 如果 `columnsWithAlias=true`,将返回 `u.id` 而不仅仅是 `id`。 ##### `compress` ``` Type: bool Valid Values: true, false Default: false ``` 切换 zlib 压缩。默认为 false。 ##### `interpolateParams` ``` Type: bool Valid Values: true, false Default: false ``` 如果 `interpolateParams` 为 true,则在调用 `db.Query()` 和 `db.Exec()` 时,占位符(`?`)会根据给定的参数插值到一个单一的查询字符串中。这减少了往返次数,因为在 `interpolateParams=false` 时,驱动程序必须准备一个语句,使用给定的参数执行它然后再次关闭该语句。 *这不能与多字节编码 BIG5, CP932, GB2312, GBK 或 SJIS 一起使用。这些会被拒绝,因为它们可能会[引入 SQL 注入漏洞](http://stackoverflow.com/a/12118602/3430118)!* ##### `loc` ``` Type: string Valid Values: Default: UTC ``` 设置 `time.Time` 值的位置(当使用 `parseTime=true` 时)。*"Local"* 设置系统位置。详情请参见 [time.LoadLocation](https://golang.org/pkg/time/#LoadLocation)。 请注意,这设置了 `time.Time` 值的位置,但不会更改 MySQL 的 [time_zone 设置](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html)。有关此内容,请参见 [time_zone 系统变量](#system-variables)),它也可以设置为 DSN 参数。 请记住,参数值必须经过 [url.QueryEscape](https://golang.org/pkg/net/url/#QueryEscape) 处理。或者,您可以手动将 `/` 替换为 `%2F`。例如 `US/Pacific` 将变为 `loc=US%2FPacific`。 ##### `timeTruncate` ``` Type: duration Default: 0 ``` 将时间值[截断](https://pkg.go.dev/time#Duration.Truncate)到指定的持续时间。该值必须是带有单位后缀(*"ms"*、*"s"*、*"m"*、*"h"*)的十进制数字,例如 *"30s"*、*"0.5m"* 或 *"1m30s"*。 ##### `maxAllowedPacket` ``` Type: decimal number Default: 64*1024*1024 ``` 允许的最大数据包大小(以字节为单位)。默认值为 64 MiB,应进行调整以匹配服务器设置。可使用 `maxAllowedPacket=0` 在*每次连接时*自动从服务器获取 `max_allowed_packet` 变量。 ##### `multiStatements` ``` Type: bool Valid Values: true, false Default: false ``` 允许在一个查询中使用多个语句。这可用于批量处理多个查询。使用 [Rows.NextResultSet()](https://pkg.go.dev/database/sql#Rows.NextResultSet) 获取第二个及后续查询的结果。 使用 `multiStatements` 时,`?` 参数只能在第一个语句中使用。可以使用 [interpolateParams](#interpolateparams) 来避免此限制,除非显式使用了 prepared statement。 可以通过使用 `sql.Conn.Raw()` 和 `mysql.Result` 来获取多个语句的最后插入 ID 和受影响的行数。例如: ``` conn, _ := db.Conn(ctx) conn.Raw(func(conn any) error { ex := conn.(driver.Execer) res, err := ex.Exec(` UPDATE point SET x = 1 WHERE y = 2; UPDATE point SET x = 2 WHERE y = 3; `, nil) // Both slices have 2 elements. log.Print(res.(mysql.Result).AllRowsAffected()) log.Print(res.(mysql.Result).AllLastInsertIds()) }) ``` ##### `parseTime` ``` Type: bool Valid Values: true, false Default: false ``` `parseTime=true` 将 `DATE` 和 `DATETIME` 值的输出类型更改为 `time.Time`,而不是 `[]byte` / `string` 像 `0000-00-00 00:00:00` 这样的 date 或 datetime 会被转换为 `time.Time` 的零值。 ##### `readTimeout` ``` Type: duration Default: 0 ``` I/O 读取超时。该值必须是带有单位后缀(*"ms"*、*"s"*、*"m"*、h"*)的十进制数字,例如 *"30s"*、*"0.5m"* 或 *"1m30s"*。 ##### `rejectReadOnly` ``` Type: bool Valid Values: true, false Default: false ``` `rejectReadOnly=true` 使驱动程序拒绝只读连接。这是 为了应对在自动故障转移期间可能出现的竞争条件,即 mysql 客户端在故障转移后连接到了只读副本。 请注意,这应该是相当罕见的情况,因为自动故障转移通常 在主节点宕机时发生,除非它在故障转移一启动就重新 上线,否则不应该发生竞争条件。在 另一方面,当这种情况发生时,MySQL 应用程序可能会卡在 只读连接上,直到重启。然而,这很容易重现, 例如,在 AWS Aurora 的兼容 MySQL 的集群上使用手动故障转移。 如果您不依赖只读事务来拒绝不应该 发生的写入,那么在某些 MySQL 提供商(例如 AWS Aurora)上启用此设置 对于故障转移更安全。 请注意,`read-only` 服务器可能会返回 ERROR 1290,此选项将 导致针对该错误进行重试。然而,相同的错误号也用于某些 其他情况。您应该确保在启用此选项时,您的应用程序永远不会导致 ERROR 1290, 除非是处于 `read-only` 模式。 ##### `serverPubKey` ``` Type: string Valid Values: Default: none ``` 服务器公钥可以使用 [`mysql.RegisterServerPubKey`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterServerPubKey) 进行注册,然后可以在 DSN 中通过指定的名称使用。 公钥用于传输加密数据,例如用于身份验证。 如果已知服务器的公钥,则应手动设置,以避免每次需要时都从服务器向客户端进行昂贵且可能不安全的公钥传输。 ##### `timeout` ``` Type: duration Default: OS default ``` 建立连接的超时时间,也就是拨号超时。该值必须是带有单位后缀(*"ms"*、*"s"*、*"m"*、*"h"*)的十进制数字,例如 *"30s"*、*"0.5m"* 或 *"1m30s"*。 ##### `tls` ``` Type: bool / string Valid Values: true, false, skip-verify, preferred, Default: false ``` `tls=true` 启用到服务器的 TLS / SSL 加密连接。如果您想使用自签名或无效的证书(服务器端),请使用 `skip-verify`;如果您只想在服务器播发时使用 TLS,请使用 `preferred`。这类似于 `skip-verify`,但额外允许回退到未加密的连接。`skip-verify` 和 `preferred` 都不能提供任何可靠的安全性。您可以在使用 [`mysql.RegisterTLSConfig`](https://godoc.org/github.com/go-sql-driver/mysql#RegisterTLSConfig) 注册自定义 TLS 配置后使用它。 ##### `writeTimeout` ``` Type: duration Default: 0 ``` I/O 写入超时。该值必须是带有单位后缀(*"ms"*、*"s"*、*"m"*、*"h"*)的十进制数字,例如 *"30s"*、*"0.5m"* 或 *"1m30s"*。 ##### `connectionAttributes` ``` Type: comma-delimited string of user-defined "key:value" pairs Valid Values: (:,:,...) Default: none ``` [连接属性](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-connection-attribute-tables.html)是应用程序在连接时传递给服务器的键值对。 ##### 系统变量 任何其他参数都被解释为系统变量: * `=`: `SET =` * `=`: `SET =` * `=%27%27`: `SET =''` 规则: * 字符串变量的值必须用 `'` 引号括起来。 * 这些值还必须经过 [url.QueryEscape](http://golang.org/pkg/net/url/#QueryEscape) 处理! (这意味着字符串变量的值必须用 `%27` 包装)。 示例: * `autocommit=1`: `SET autocommit=1` * [`time_zone=%27Europe%2FParis%27`](https://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html): `SET time_zone='Europe/Paris'` * [`transaction_isolation=%27REPEATABLE-READ%27`](https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_transaction_isolation): `SET transaction_isolation='REPEATABLE-READ'` #### 示例 ``` user@unix(/path/to/socket)/dbname ``` ``` root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local ``` ``` user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true ``` 通过设置系统变量 [`sql_mode`](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html) 将警告视为错误: ``` user:password@/dbname?sql_mode=TRADITIONAL ``` 通过 IPv6 的 TCP: ``` user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_unicode_ci ``` 远程主机上的 TCP,例如 Amazon RDS: ``` id:password@tcp(your-amazonaws-uri.com:3306)/dbname ``` App Engine 上的 Google Cloud SQL: ``` user:password@unix(/cloudsql/project-id:region-name:instance-name)/dbname ``` localhost 上使用默认端口 (3306) 的 TCP: ``` user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped ``` 使用默认协议和主机 (localhost:3306): ``` user:password@/dbname ``` 未预选数据库: ``` user:password@/ ``` ### 连接池和超时 连接池由 Go 的 database/sql 包管理。有关如何配置连接池大小以及连接在池中保留多长时间的详细信息,请参见 [database/sql 文档](https://golang.org/pkg/database/sql/)中的 `*DB.SetMaxOpenConns`、`*DB.SetMaxIdleConns` 和 `*DB.SetConnMaxLifetime`。每个单独连接的读取、写入和拨号超时分别由 DSN 参数 [`readTimeout`](#readtimeout)、[`writeTimeout`](#writetimeout) 和 [`timeout`](#timeout) 配置。 ## `ColumnType` 支持 此驱动程序支持在 Go 1.8 中引入的 [`ColumnType` 接口](https://golang.org/pkg/database/sql/#ColumnType),但不支持目前尚未实现的 [`ColumnType.Length()`](https://golang.org/pkg/database/sql/#ColumnType.Length)。所有 Unsigned 数据库类型名称将返回带 `UNSIGNED ` 的 `INT`, `TINYINT`, `SMALLINT`, `MEDIUMINT`, `BIGINT`。 ## `context.Context` 支持 Go 1.8 为 `context.Context` 添加了 `database/sql` 支持。此驱动程序支持通过 context 进行查询超时和取消。 有关更多详细信息,请参见 [database/sql 包中的 context 支持](https://golang.org/doc/go1.8#database_sql)。 ### `LOAD DATA LOCAL INFILE` 支持 要使用此功能,您需要直接访问该包。因此,您必须更改导入路径(不带 `_`): ``` import "github.com/go-sql-driver/mysql" ``` 必须通过使用 `mysql.RegisterLocalFile(filepath)`(推荐)显式注册文件来允许它们,或者通过使用 DSN 参数 `allowAllFiles=true` 停用白名单检查([*可能不安全!*](https://dev.mysql.com/doc/refman/8.0/en/load-data.html#load-data-local))。 要使用 `io.Reader`,必须使用 `mysql.RegisterReaderHandler(name, handler)` 注册一个返回 `io.Reader` 或 `io.ReadCloser` 的处理函数。然后就可以通过文件路径 `Reader::` 访问该 Reader。为不同的处理程序选择不同的名称,并在不再需要时使用 `DeregisterReaderHandler`。 有关详细信息,请参见 [Go-MySQL-Driver 的 godoc](https://godoc.org/github.com/go-sql-driver/mysql "golang mysql driver documentation")。 ### `time.Time` 支持 MySQL `DATE` 和 `DATETIME` 值的默认内部输出类型是 `[]byte`,它允许您将值扫描到程序中的 `[]byte`、`string` 或 `sql.RawBytes` 变量中。 然而,许多人希望将 MySQL `DATE` 和 `DATETIME` 值扫描到 `time.Time` 变量中,这是 Go 中与 MySQL 的 `DATE` 和 `DATETIME` 在逻辑上等价的类型。您可以通过使用 DSN 参数 `parseTime=true` 将内部输出类型从 `[]byte` 更改为 `time.Time` 来实现。您可以使用 `loc` DSN 参数设置默认的 [`time.Time` 位置](https://golang.org/pkg/time/#Location)。 **注意:** 从 Go 1.1 开始,这使 `time.Time` 成为您可以扫描 `DATE` 和 `DATETIME` 值的唯一变量类型。这会破坏例如 [`sql.RawBytes` 支持](https://github.com/go-sql-driver/mysql/wiki/Examples#rawbytes)。 ### Unicode 支持 自 1.5 版本起,Go-MySQL-Driver 默认自动使用 ` utf8mb4_general_ci` collation。 可以使用 [`charset`](#charset) 或 [`collation`](#collation) DSN 参数设置其他字符集 / collation。 - 当仅指定 `charset` 时,会发送 `SET NAMES ` 查询,并使用服务器的默认 collation。 - 当同时指定 `charset` 和 `collation` 时,会发送 `SET NAMES COLLATE ` 查询。 - 当仅指定 `collation` 时,会在协议握手期间指定 collation,并且不发送 `SET NAMES` 查询。这可以节省一次往返,但请注意,服务器可能会静默忽略指定的 collation,并改用服务器的默认字符集/collation。 有关 MySQL Unicode 支持的更多详细信息,请参见 http://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html。 ## 测试 / 开发 要运行驱动程序测试,您可能需要调整配置。详情请参见[测试 Wiki 页面](https://github.com/go-sql-driver/mysql/wiki/Testing "Testing")。 Go-MySQL-Driver 尚未功能完整。非常感谢您的帮助。 如果您想做出贡献,可以处理一个 [open issue](https://github.com/go-sql-driver/mysql/issues?state=open) 或审查一个 [pull request](https://github.com/go-sql-driver/mysql/pulls)。 详情请参见[贡献指南](https://github.com/go-sql-driver/mysql/blob/master/.github/CONTRIBUTING.md)。 ## License Go-MySQL-Driver 采用 [Mozilla Public License Version 2.0](https://raw.github.com/go-sql-driver/mysql/master/LICENSE) Mozilla 将许可范围总结如下: 这意味着: * 您可以**使用**未更改的源代码,无论是私用还是商用。 * 在分发时,您**必须**根据 a) MPL 2.0 本身或 b) 兼容许可证(例如 GPL 3.0 或 Apache License 2.0),**公布**任何根据 MPL 2.0 许可的**已更改文件**的源代码。 * 只要根据 MPL 2.0 许可的文件**未被更改**,您就**无需公布**您库的源代码。 如果您对该许可证有进一步的疑问,请阅读 [MPL 2.0 FAQ](https://www.mozilla.org/en-US/MPL/2.0/FAQ/)。 您可以在此处阅读完整条款:[LICENSE](https://raw.github.com/go-sql-driver/mysql/master/LICENSE)。 ![Go Gopher and MySQL Dolphin](https://raw.github.com/wiki/go-sql-driver/mysql/go-mysql-driver_m.jpg "Golang Gopher transporting the MySQL Dolphin in a wheelbarrow")
标签:EVTX分析, Go, Ruby工具, 开发组件, 数据库, 数据库连接池, 日志审计, 驱动