Bugfixes:
Major Changes:
- Use
SET NAMES charset COLLATE collation
. by @methane in #1437- Older go-mysql-driver used
collation_id
in the handshake packet. But it caused collation mismatch in some situation. - If you don't specify charset nor collation, go-mysql-driver sends
SET NAMES utf8mb4
for new connection. This uses server's default collation for utf8mb4. - If you specify charset, go-mysql-driver sends
SET NAMES <charset>
. This uses the server's default collation for<charset>
. - If you specify collation and/or charset, go-mysql-driver sends
SET NAMES charset COLLATE collation
.
- Older go-mysql-driver used
- PathEscape dbname in DSN. by @methane in #1432
- This is backward incompatible in rare case. Check your DSN.
- Drop Go 1.13-17 support by @methane in #1420
- Use Go 1.18+
- Parse numbers on text protocol too by @methane in #1452
- When text protocol is used, go-mysql-driver passed bare
[]byte
to database/sql for avoid unnecessary allocation and conversion. - If user specified
*any
toScan()
, database/sql passed the[]byte
into the target variable. - This confused users because most user doesn't know when text/binary protocol used.
- go-mysql-driver 1.8 converts integer/float values into int64/double even in text protocol. This doesn't increase allocation compared to
[]byte
and conversion cost is negatable.
- When text protocol is used, go-mysql-driver passed bare
- New options start using the Functional Option Pattern to avoid increasing technical debt in the Config object. Future version may introduce Functional Option for existing options, but not for now.
Other changes:
- Adding DeregisterDialContext to prevent memory leaks with dialers we don't need anymore by @jypelle in go-sql-driver#1422
- Make logger configurable per connection by @frozenbonito in go-sql-driver#1408
- Fix ColumnType.DatabaseTypeName for mediumint unsigned by @evanelias in go-sql-driver#1428
- Add connection attributes by @Daemonxiao in go-sql-driver#1389
- Stop
ColumnTypeScanType()
from returningsql.RawBytes
by @methane in go-sql-driver#1424 - Exec() now provides access to status of multiple statements. by @mherr-google in go-sql-driver#1309
- Allow to change (or disable) the default driver name for registration by @dolmen in go-sql-driver#1499
- Add default connection attribute '_server_host' by @oblitorum in go-sql-driver#1506
- QueryUnescape DSN ConnectionAttribute value by @zhangyangyu in go-sql-driver#1470
- Add client_ed25519 authentication by @Gusted in go-sql-driver#1518
Changes:
- bump actions/checkout@v3 and actions/setup-go@v3 (#1375)
- Add go1.20 and mariadb10.11 to the testing matrix (#1403)
- Increase default maxAllowedPacket size. (#1411)
Bugfixes:
- Use SET syntax as specified in the MySQL documentation (#1402)
Changes:
- Drop support of Go 1.12 (#1211)
- Refactoring
(*textRows).readRow
in a more clear way (#1230) - util: Reduce boundary check in escape functions. (#1316)
- enhancement for mysqlConn handleAuthResult (#1250)
New Features:
- support Is comparison on MySQLError (#1210)
- return unsigned in database type name when necessary (#1238)
- Add API to express like a --ssl-mode=PREFERRED MySQL client (#1370)
- Add SQLState to MySQLError (#1321)
Bugfixes:
- Fix parsing 0 year. (#1257)
Changes:
- Migrate the CI service from travis-ci to GitHub Actions (#1176, #1183, #1190)
NullTime
is deprecated (#960, #1144)- Reduce allocations when building SET command (#1111)
- Performance improvement for time formatting (#1118)
- Performance improvement for time parsing (#1098, #1113)
New Features:
- Implement
driver.Validator
interface (#1106, #1174) - Support returning
uint64
fromValuer
inConvertValue
(#1143) - Add
json.RawMessage
for converter and prepared statement (#1059) - Interpolate
json.RawMessage
asstring
(#1058) - Implements
CheckNamedValue
(#1090)
Bugfixes:
- Stop rounding times (#1121, #1172)
- Put zero filler into the SSL handshake packet (#1066)
- Fix checking cancelled connections back into the connection pool (#1095)
- Fix remove last 0 byte for mysql_old_password when password is empty (#1133)
Changes:
- Dropped support Go 1.9 and lower (#823, #829, #886, #1016, #1017)
- Improve buffer handling (#890)
- Document potentially insecure TLS configs (#901)
- Use a double-buffering scheme to prevent data races (#943)
- Pass uint64 values without converting them to string (#838, #955)
- Update collations and make utf8mb4 default (#877, #1054)
- Make NullTime compatible with sql.NullTime in Go 1.13+ (#995)
- Removed CloudSQL support (#993, #1007)
- Add Go Module support (#1003)
New Features:
- Implement support of optional TLS (#900)
- Check connection liveness (#934, #964, #997, #1048, #1051, #1052)
- Implement Connector Interface (#941, #958, #1020, #1035)
Bugfixes:
- Mark connections as bad on error during ping (#875)
- Mark connections as bad on error during dial (#867)
- Fix connection leak caused by rapid context cancellation (#1024)
- Mark connections as bad on error during Conn.Prepare (#1030)
Bugfixes:
- Fix TIME format for binary columns (#818)
- Fix handling of empty auth plugin names (#835)
- Fix caching_sha2_password with empty password (#826)
- Fix canceled context broke mysqlConn (#862)
- Fix OldAuthSwitchRequest support (#870)
- Fix Auth Response packet for cleartext password (#887)
Changes:
- Documentation fixes (#530, #535, #567)
- Refactoring (#575, #579, #580, #581, #603, #615, #704)
- Cache column names (#444)
- Sort the DSN parameters in DSNs generated from a config (#637)
- Allow native password authentication by default (#644)
- Use the default port if it is missing in the DSN (#668)
- Removed the
strict
mode (#676) - Do not query
max_allowed_packet
by default (#680) - Dropped support Go 1.6 and lower (#696)
- Updated
ConvertValue()
to match the database/sql/driver implementation (#760) - Document the usage of
0000-00-00T00:00:00
as the time.Time zero value (#783) - Improved the compatibility of the authentication system (#807)
New Features:
- Multi-Results support (#537)
rejectReadOnly
DSN option (#604)context.Context
support (#608, #612, #627, #761)- Transaction isolation level support (#619, #744)
- Read-Only transactions support (#618, #634)
NewConfig
function which initializes a config with default values (#679)- Implemented the
ColumnType
interfaces (#667, #724) - Support for custom string types in
ConvertValue
(#623) - Implemented
NamedValueChecker
, improving support for uint64 with high bit set (#690, #709, #710) caching_sha2_password
authentication plugin support (#794, #800, #801, #802)- Implemented
driver.SessionResetter
(#779) sha256_password
authentication plugin support (#808)
Bugfixes:
- Use the DSN hostname as TLS default ServerName if
tls=true
(#564, #718) - Fixed LOAD LOCAL DATA INFILE for empty files (#590)
- Removed columns definition cache since it sometimes cached invalid data (#592)
- Don't mutate registered TLS configs (#600)
- Make RegisterTLSConfig concurrency-safe (#613)
- Handle missing auth data in the handshake packet correctly (#646)
- Do not retry queries when data was written to avoid data corruption (#302, #736)
- Cache the connection pointer for error handling before invalidating it (#678)
- Fixed imports for appengine/cloudsql (#700)
- Fix sending STMT_LONG_DATA for 0 byte data (#734)
- Set correct capacity for []bytes read from length-encoded strings (#766)
- Make RegisterDial concurrency-safe (#773)
Changes:
- Go 1.1 is no longer supported
- Use decimals fields in MySQL to format time types (#249)
- Buffer optimizations (#269)
- TLS ServerName defaults to the host (#283)
- Refactoring (#400, #410, #437)
- Adjusted documentation for second generation CloudSQL (#485)
- Documented DSN system var quoting rules (#502)
- Made statement.Close() calls idempotent to avoid errors in Go 1.6+ (#512)
New Features:
- Enable microsecond resolution on TIME, DATETIME and TIMESTAMP (#249)
- Support for returning table alias on Columns() (#289, #359, #382)
- Placeholder interpolation, can be activated with the DSN parameter
interpolateParams=true
(#309, #318, #490) - Support for uint64 parameters with high bit set (#332, #345)
- Cleartext authentication plugin support (#327)
- Exported ParseDSN function and the Config struct (#403, #419, #429)
- Read / Write timeouts (#401)
- Support for JSON field type (#414)
- Support for multi-statements and multi-results (#411, #431)
- DSN parameter to set the driver-side max_allowed_packet value manually (#489)
- Native password authentication plugin support (#494, #524)
Bugfixes:
- Fixed handling of queries without columns and rows (#255)
- Fixed a panic when SetKeepAlive() failed (#298)
- Handle ERR packets while reading rows (#321)
- Fixed reading NULL length-encoded integers in MySQL 5.6+ (#349)
- Fixed absolute paths support in LOAD LOCAL DATA INFILE (#356)
- Actually zero out bytes in handshake response (#378)
- Fixed race condition in registering LOAD DATA INFILE handler (#383)
- Fixed tests with MySQL 5.7.9+ (#380)
- QueryUnescape TLS config names (#397)
- Fixed "broken pipe" error by writing to closed socket (#390)
- Fixed LOAD LOCAL DATA INFILE buffering (#424)
- Fixed parsing of floats into float64 when placeholders are used (#434)
- Fixed DSN tests with Go 1.7+ (#459)
- Handle ERR packets while waiting for EOF (#473)
- Invalidate connection on error while discarding additional results (#513)
- Allow terminating packets of length 0 (#516)
Changes:
- We switched back to a "rolling release".
go get
installs the current master branch again - Version v1 of the driver will not be maintained anymore. Go 1.0 is no longer supported by this driver
- Exported errors to allow easy checking from application code
- Enabled TCP Keepalives on TCP connections
- Optimized INFILE handling (better buffer size calculation, lazy init, ...)
- The DSN parser also checks for a missing separating slash
- Faster binary date / datetime to string formatting
- Also exported the MySQLWarning type
- mysqlConn.Close returns the first error encountered instead of ignoring all errors
- writePacket() automatically writes the packet size to the header
- readPacket() uses an iterative approach instead of the recursive approach to merge split packets
New Features:
RegisterDial
allows the usage of a custom dial function to establish the network connection- Setting the connection collation is possible with the
collation
DSN parameter. This parameter should be preferred over thecharset
parameter - Logging of critical errors is configurable with
SetLogger
- Google CloudSQL support
Bugfixes:
- Allow more than 32 parameters in prepared statements
- Various old_password fixes
- Fixed TestConcurrent test to pass Go's race detection
- Fixed appendLengthEncodedInteger for large numbers
- Renamed readLengthEnodedString to readLengthEncodedString and skipLengthEnodedString to skipLengthEncodedString (fixed typo)
Changes:
- Go-MySQL-Driver now requires Go 1.1
- Connections now use the collation
utf8_general_ci
by default. Adding&charset=UTF8
to the DSN should not be necessary anymore - Made closing rows and connections error tolerant. This allows for example deferring rows.Close() without checking for errors
[]byte(nil)
is now treated as a NULL value. Before, it was treated like an empty string /[]byte("")
- DSN parameter values must now be url.QueryEscape'ed. This allows text values to contain special characters, such as '&'.
- Use the IO buffer also for writing. This results in zero allocations (by the driver) for most queries
- Optimized the buffer for reading
- stmt.Query now caches column metadata
- New Logo
- Changed the copyright header to include all contributors
- Improved the LOAD INFILE documentation
- The driver struct is now exported to make the driver directly accessible
- Refactored the driver tests
- Added more benchmarks and moved all to a separate file
- Other small refactoring
New Features:
- Added old_passwords support: Required in some cases, but must be enabled by adding
allowOldPasswords=true
to the DSN since it is insecure - Added a
clientFoundRows
parameter: Return the number of matching rows instead of the number of rows changed on UPDATEs - Added TLS/SSL support: Use a TLS/SSL encrypted connection to the server. Custom TLS configs can be registered and used
Bugfixes:
- Fixed MySQL 4.1 support: MySQL 4.1 sends packets with lengths which differ from the specification
- Convert to DB timezone when inserting
time.Time
- Split packets (more than 16MB) are now merged correctly
- Fixed false positive
io.EOF
errors when the data was fully read - Avoid panics on reuse of closed connections
- Fixed empty string producing false nil values
- Fixed sign byte for positive TIME fields
Initial Release