[wp-trac] [WordPress Trac] #49364: dbDelta() should not change display width for integer data types on MySQL 8.0.17+
WordPress Trac
noreply at wordpress.org
Mon Aug 15 13:16:37 UTC 2022
#49364: dbDelta() should not change display width for integer data types on MySQL
8.0.17+
-------------------------------------------------+-------------------------
Reporter: SergeyBiryukov | Owner:
| SergeyBiryukov
Type: defect (bug) | Status: closed
Priority: normal | Milestone: 6.1
Component: Database | Version:
Severity: normal | Resolution: fixed
Keywords: has-patch needs-testing early | Focuses:
needs-testing-info |
-------------------------------------------------+-------------------------
Changes (by SergeyBiryukov):
* owner: (none) => SergeyBiryukov
* status: new => closed
* resolution: => fixed
Comment:
In [changeset:"53897" 53897]:
{{{
#!CommitTicketReference repository="" revision="53897"
Database: Ignore display width for integer data types in `dbDelta()` on
MySQL 8.0.17 or later.
MySQL 8.0.17 deprecated the display width attribute for integer data
types:
> As of MySQL 8.0.17, the `ZEROFILL` attribute is deprecated for numeric
data types, as is the display width attribute for integer data types. You
should expect support for `ZEROFILL` and display widths for integer data
types to be removed in a future version of MySQL. Consider using an
alternative means of producing the effect of these attributes. For
example, applications can use the `LPAD()` function to zero-pad numbers up
to the desired width, or they can store the formatted numbers in `CHAR`
columns.
In practice, this means that display width is removed for integer types
when creating a table:
* `BIGINT(20)` → `BIGINT`
* `INT(11)` → `INT`
* `MEDIUMINT(9)` → `MEDIUMINT`
* `SMALLINT(6)` → `SMALLINT`
* `TINYINT(4)` → `TINYINT`
Note: This only applies specifically to MySQL 8.0.17 or later. In MariaDB,
display width for integer types is still available and expected.
This commit ensures that `dbDelta()`, which relies on the `DESCRIBE` SQL
command to get the existing table structure and field types, when running
on MySQL 8.0.17 or later, does not unnecessarily attempt to convert
`BIGINT` fields back to `BIGINT(20)`, `INT` back to `INT(11)`, etc. When
comparing the field type in the query with the existing field type, if
display width is the only difference, it can be safely ignored to match
MySQL behavior.
The change is covered by existing `dbDelta()` unit tests:
* A test for not altering `wp_get_db_schema()` queries on an existing
install using MySQL 8.0.17+ now passes.
* More than twenty tests which previously failed on PHP 8.0.x + MariaDB
due to incorrect expectations, caused by MariaDB version reporting not
being consistent between PHP versions, now pass.
References:
* [https://dev.mysql.com/doc/refman/8.0/en/numeric-type-attributes.html
MySQL: Nymeric Type Attributes]
* [https://mariadb.com/kb/en/data-types-numeric-data-types/ MariaDB:
Numeric Data Types]
Follow-up to [1575], [18899], [37525], [47183], [47184].
Props SergeyBiryukov, pbearne, leewillis77, JavierCasares, desrosj,
costdev, johnbillion.
Fixes #49364. See #51740.
}}}
--
Ticket URL: <https://core.trac.wordpress.org/ticket/49364#comment:34>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list