Repository navigation
Cannot use binary parameter values with "NO_BACKSLASH_ESCAPES" SQL mode #999
Copy link
Copy link
Closed
Description
Hi, we are using MySqlConnector 1.3.9 with a MySQL 8.0.25 DB. After opening the connection, we set the NO_BACKSLASH_ESCAPES SQL mode, but it seems that even when we set the MySqlConnectionStringBuilder.NoBackslashEscapes property, binary parameter values don't work correctly.
Consider the following program (running as .NET 5.0 console application):
static void Main(string[] args)
{
var builder = new MySqlConnectionStringBuilder() {
Server = "localhost",
Port = 3306,
UserID = "root",
Password = "xxxx",
AllowPublicKeyRetrieval = true,
NoBackslashEscapes = true,
Pooling = false,
Database = "MyTestDb1"
};
using var con = new MySqlConnection(builder.ToString());
con.Open();
using var cmd = con.CreateCommand();
cmd.CommandText = $"SET SESSION sql_mode = CONCAT((SELECT @@SESSION.sql_mode), ',NO_BACKSLASH_ESCAPES');";
cmd.ExecuteNonQuery();
cmd.CommandText = $"CREATE TABLE IF NOT EXISTS MyTable1 (ID BIGINT, Bytes VARBINARY(512));";
cmd.ExecuteNonQuery();
cmd.CommandText = $"INSERT INTO `MyTable1` VALUES (1, @P1);";
var binaryValue = Enumerable.Range(0, 256).Select(e => (byte)e).ToArray();
cmd.Parameters.AddWithValue("@P1", binaryValue);
cmd.ExecuteNonQuery();
cmd.Parameters.Clear();
}When running, it throws an exception:
MySqlConnector.MySqlException (0x80004005): 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 '()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuv' at line 2
at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in /_/src/MySqlConnector/Core/ResultSet.cs:line 50
at MySqlConnector.MySqlDataReader.ActivateResultSet(CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlDataReader.cs:line 135
at MySqlConnector.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary`2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlDataReader.cs:line 444
at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/CommandExecutor.cs:line 60
at MySqlConnector.MySqlCommand.ExecuteNonQueryAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySqlCommand.cs:line 266
at MySqlConnector.MySqlCommand.ExecuteNonQuery() in /_/src/MySqlConnector/MySqlCommand.cs:line 101
at mysql_repro.Program.Main(String[] args) in C:\Users\developer4\Desktop\mysql-repro\Program.cs:line 39
Edit: It seems the escaping logic for binary values has been overlooked when implementing #701. With commit kpreisser@70b8a4b, binary parameter values work correctly when setting NoBackslashEscapes to true.
Should I submit a PR?
Thank you!
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
Handle NoBackslashEscapes for binay parameter values.
bgrainger commentedon Jun 11, 2021
Thanks for the fix! Yes, please do.
Handle NoBackslashEscapes for binay parameter values.
bgrainger commentedon Jun 16, 2021
Fixed in 1.3.10.