From: Mike Bayer Date: Sat, 2 Oct 2021 15:53:55 +0000 (-0400) Subject: support utf8mb3 char encoding fully for mysqlclient, others X-Git-Tag: rel_1_4_26~42 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=71e463506217e3acc379a3f459e68a81792a0aac;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git support utf8mb3 char encoding fully for mysqlclient, others Fixes to accommodate for the MariaDB 10.6 series, including backwards incompatible changes in both the mariadb-connector Python driver (supported on SQLAlchemy 1.4 only) as well as the native 10.6 client libraries that are used automatically by the mysqlclient DBAPI (applies to both 1.3 and 1.4). The "utf8mb3" encoding symbol is now reported by these client libraries when the encoding is stated as "utf8", leading to lookup and encoding errors within the MySQL dialect that does not expect this symbol. Updates to both the MySQL base library to accommodate for this utf8mb3 symbol being reported as well as to the test suite. Thanks to Georg Richter for support. Fixes: #7136 Fixes: #7115 Change-Id: I655d9d9868aef76037023d0c602b8a7c881780b0 --- diff --git a/doc/build/changelog/unreleased_13/7115.rst b/doc/build/changelog/unreleased_13/7115.rst new file mode 100644 index 0000000000..1f2c7fcf86 --- /dev/null +++ b/doc/build/changelog/unreleased_13/7115.rst @@ -0,0 +1,16 @@ +.. change:: + :tags: bug, mysql, mariadb + :tickets: 7115, 7136 + :versions: 1.4.26 + + Fixes to accommodate for the MariaDB 10.6 series, including backwards + incompatible changes in both the mariadb-connector Python driver (supported + on SQLAlchemy 1.4 only) as well as the native 10.6 client libraries that + are used automatically by the mysqlclient DBAPI (applies to both 1.3 and + 1.4). The "utf8mb3" encoding symbol is now reported by these client + libraries when the encoding is stated as "utf8", leading to lookup and + encoding errors within the MySQL dialect that does not expect this symbol. + Updates to both the MySQL base library to accommodate for this utf8mb3 + symbol being reported as well as to the test suite. Thanks to Georg Richter + for support. + diff --git a/doc/build/changelog/unreleased_14/7115.rst b/doc/build/changelog/unreleased_14/7115.rst deleted file mode 100644 index 561e152315..0000000000 --- a/doc/build/changelog/unreleased_14/7115.rst +++ /dev/null @@ -1,8 +0,0 @@ -.. change:: - :tags: bug, mysql, tests - :tickets: 7115 - - Updated test suite to pass correctly for MariaDB 10.6 when using the - mariadb-connector driver, which made some adjustments to default encoding. - Pull request courtesy Georg Richter. - diff --git a/test/dialect/mysql/test_dialect.py b/test/dialect/mysql/test_dialect.py index 57dd9d393d..48fe3d3b1f 100644 --- a/test/dialect/mysql/test_dialect.py +++ b/test/dialect/mysql/test_dialect.py @@ -18,6 +18,7 @@ from sqlalchemy.testing import engines from sqlalchemy.testing import eq_ from sqlalchemy.testing import expect_warnings from sqlalchemy.testing import fixtures +from sqlalchemy.testing import in_ from sqlalchemy.testing import is_ from sqlalchemy.testing import mock from ...engine import test_deprecations @@ -95,6 +96,8 @@ class BackendDialectTest(fixtures.TestBase): class DialectTest(fixtures.TestBase): + __backend__ = True + @testing.combinations( (None, "cONnection was kILLEd", "InternalError", "pymysql", True), (None, "cONnection aLREady closed", "InternalError", "pymysql", True), @@ -250,14 +253,31 @@ class DialectTest(fixtures.TestBase): "mariadb+pymysql", ] ) - def test_special_encodings(self): + @testing.combinations( + ("utf8mb4",), + ("utf8",), + ) + def test_special_encodings(self, enc): - for enc in ["utf8mb4", "utf8"]: - eng = engines.testing_engine( - options={"connect_args": {"charset": enc, "use_unicode": 0}} - ) - conn = eng.connect() - eq_(conn.dialect._connection_charset, enc) + eng = engines.testing_engine( + options={"connect_args": {"charset": enc, "use_unicode": 0}} + ) + conn = eng.connect() + + detected = conn.dialect._connection_charset + if enc == "utf8mb4": + eq_(detected, enc) + else: + in_(detected, ["utf8", "utf8mb3"]) + + @testing.only_on("mariadb+mariadbconnector") + def test_mariadb_connector_special_encodings(self): + + eng = engines.testing_engine() + conn = eng.connect() + + detected = conn.dialect._connection_charset + eq_(detected, "utf8mb4") class ParseVersionTest(fixtures.TestBase):