New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix: #6146 - utf8/utf8mb3 alias causes redundant ALTER TABLE changes #6370
base: 3.8.x
Are you sure you want to change the base?
Conversation
…tected Make internal Comparator methods protected
Remove property-based schema comparison APIs
…ftovers Remove leftovers of handling foreign keys on non-InnoDB engines for MySQL
…traint-name Introspect default constraint name
Remove conditional comments for MySQL older than 5.1.16
Remove support for "unique" and "check" column properties
…-schema Remove SchemaDiff::$fromSchema
Remove support for renaming tables via TableDiff
…lt-constraint-leftovers Remove leftovers of renaming default contraints
Remove TableDiff::$name and getName()
…perties Mark ColumnDiff properties as private and read-only
…handling-workaround Remove workaround for PHP bug in PostgreSQL exception handler
To reduce Algolia operations and indexes older versions get removed
Remove older versions from the docs
* 3.8.x: Add MariaDB 11.3 to the test matrix (doctrine#6342) Spell which properly Fix double quote used wrongly for literal value in SqliteSchemaManager (doctrine#6325)
* 3.8.x: Avoid calling deprecated Type::getName() (doctrine#6359) Ensure correct json default value normalization (doctrine#6358) Document how to run integration tests locally Remove unused script
Just pushed a change to fix the psalm issues |
It seems there are CI jobs failing. Please take a look at this guide for more on how to handle those. |
ಠ_ಠ |
Codecov says that some of the new code is untested, most notably the parts using You can learn more about such tests at https://www.doctrine-project.org/projects/doctrine-dbal/en/stable/reference/testing.html |
I think I found the reason: Let me retry this. |
In a recent PR, we got reports from CodeCov about several lines not being covered. After further inspection, I found an error message in the coverage file upload saying we hit a rate limit. This will make it more likely we spot such issues in the future. The PR: doctrine#6370
From the Codecov UI:
… we currently send 69 uploads, so there is no way we are going to be below the upload limit. I will have to look into this separately. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good overall, my feedback is not a blocker.
public function normalizeCollation(string $collation): string | ||
{ | ||
if ($this->useUtf8mb3 && str_starts_with($collation, 'utf8_')) { | ||
return 'utf8mb3' . substr($collation, 4); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd make things more obvious here:
return 'utf8mb3' . substr($collation, 4); | |
return 'utf8mb3' . substr($collation, strlen('utf8')); |
} | ||
|
||
if (! $this->useUtf8mb3 && str_starts_with($collation, 'utf8mb3_')) { | ||
return 'utf8' . substr($collation, 7); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
return 'utf8' . substr($collation, 7); | |
return 'utf8' . substr($collation, strlen('utf8mb3')); |
Ah there is one issue though: since this is a fix, you should target 3.8.x |
I can create another PR for this branch. |
Please don't, we usually do merges up. Instead, let me retarget your PR, and please rebase your commits on 3.8.x and force push. |
In a recent PR, we got reports from CodeCov about several lines not being covered. After further inspection, I found an error message in the coverage file upload saying we hit a rate limit. This will make it more likely we spot such issues in the future. The PR: doctrine#6370
The PR uses I'm going to be offline for the next week or so, and will look at this on my return. |
Enjoy your time off 👍 |
Summary
In MySQL (and MariaDB),
utf8
andutf8mb3
are aliases. Depending on the database server version, the information schema may contain one or the other. Similarly, column definitions may contain one or the other.When performing schema-comparisons, a mismatch between
utf8
andutf8mb3
causes anALTER TABLE
statement to be generated - even when columns are identical.The code already contains a function to normalize the charset/collation options:
dbal/src/Platforms/MySQL/Comparator.php
Line 83 in 61d79c6
My solution is to extend this function so that it also replaces
utf8
withutf8mb3
(or vice-versa), to match the current database connection.To detect the prefered character set for the connection, I've added:
AbstractMySQLPlatform::informationSchemaUsesUtf8mb3()
MariaDBPlatform::informationSchemaUsesUtf8mb3()
The obvious place for the new normalization logic is the
CharsetMetadataProvider
andCollationMetadataProvider
classes. These are interfaces, so this is technically a BC break, however, they are marked@internal
.I've added tests which should cover all the new/modified code. I've run it against MySQL. I don't have MariaDB to hand.