Skip to content

Commit f16d0e4

Browse files
committed
AC-9755:Set default collation to utf8mb4 for MySQL
1 parent eefdfbb commit f16d0e4

File tree

6 files changed

+51
-85
lines changed

6 files changed

+51
-85
lines changed

dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/constraint_modification.mysql829.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@
3838
`date` date DEFAULT NULL,
3939
`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
4040
`datetime` datetime DEFAULT \'0000-00-00 00:00:00\',
41-
`longtext` longtext COLLATE utf8mb4_general_ci,
42-
`mediumtext` mediumtext COLLATE utf8mb4_general_ci,
43-
`varchar` varchar(254) COLLATE utf8mb4_general_ci DEFAULT NULL,
44-
`char` char(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
41+
`longtext` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
42+
`mediumtext` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
43+
`varchar` varchar(254) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
44+
`char` char(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
4545
`mediumblob` mediumblob,
4646
`blob` blob,
4747
`boolean` tinyint(1) DEFAULT NULL,

dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/rollback.mysql829.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci',
1616
'store_owner' => 'CREATE TABLE `store_owner` (
1717
`owner_id` smallint NOT NULL AUTO_INCREMENT,
18-
`store_owner_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT \'Store Owner Name\',
18+
`store_owner_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT \'Store Owner Name\',
1919
PRIMARY KEY (`owner_id`)
2020
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT=\'Store owner information\''
2121
],
2222
'after' => [
2323
'store' => 'CREATE TABLE `store` (
24-
`store_owner` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT \'Store Owner Name\'
24+
`store_owner` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT \'Store Owner Name\'
2525
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci'
2626
]
2727
];

dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/declarative_installer/table_rename.mysql829.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77

88
return [
99
'before' => 'CREATE TABLE `some_table` (
10-
`some_column` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT \'Some Column Name\'
10+
`some_column` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT \'Some Column Name\'
1111
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci',
1212
'after' => 'CREATE TABLE `some_table_renamed` (
13-
`some_column` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT \'Some Column Name\'
13+
`some_column` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT \'Some Column Name\'
1414
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci',
1515
];

dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/dry_run_log.mysql829.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@
3737
`date` date NULL ,
3838
`timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
3939
`datetime` datetime NULL DEFAULT 0 ,
40-
`longtext` longtext NULL ,
41-
`mediumtext` mediumtext NULL ,
42-
`varchar` varchar(254) NULL ,
43-
`char` char(255) NULL ,
40+
`longtext` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL ,
41+
`mediumtext` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL ,
42+
`varchar` varchar(254) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL ,
43+
`char` char(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL ,
4444
`mediumblob` mediumblob NULL ,
4545
`blob` blob NULL ,
4646
`boolean` BOOLEAN NULL ,
@@ -51,7 +51,7 @@
5151
5252
CREATE TABLE `patch_list` (
5353
`patch_id` int NOT NULL AUTO_INCREMENT COMMENT "Patch Auto Increment",
54-
`patch_name` varchar(1024) NOT NULL COMMENT "Patch Class Name",
54+
`patch_name` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT "Patch Class Name",
5555
CONSTRAINT PRIMARY KEY (`patch_id`)
5656
) ENGINE=innodb DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_general_ci COMMENT="List of data/schema patches"
5757

dev/tests/setup-integration/_files/Magento/TestSetupDeclarationModule1/fixture/dry_run_log_on_upgrade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88
99
ALTER TABLE `auto_increment_test` MODIFY COLUMN `int_auto_increment_with_nullable` int UNSIGNED NULL
1010
11-
ALTER TABLE `test_table` MODIFY COLUMN `float` float(12, 10) NULL DEFAULT 0 , MODIFY COLUMN `double` double(245, 10) NULL , MODIFY COLUMN `timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP , MODIFY COLUMN `varchar` varchar(100) NULL , MODIFY COLUMN `boolean` BOOLEAN NULL DEFAULT 1
11+
ALTER TABLE `test_table` MODIFY COLUMN `float` float(12, 10) NULL DEFAULT 0 , MODIFY COLUMN `double` double(245, 10) NULL , MODIFY COLUMN `timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP , MODIFY COLUMN `varchar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL , MODIFY COLUMN `boolean` BOOLEAN NULL DEFAULT 1
1212
1313
'];

setup/src/Magento/Setup/Model/Installer.php

Lines changed: 37 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -663,23 +663,11 @@ private function setupModuleRegistry(SchemaSetupInterface $setup)
663663
// change the charset to utf8mb4
664664
$getTableSchema = $connection->getCreateTable($setup->getTable('setup_module')) ?? '';
665665
if (str_contains($getTableSchema, self::OLDCHARSET)) {
666-
$charset = $this->columnConfig->getDefaultCharset();
667-
$collate = $this->columnConfig->getDefaultCollation();
668-
$columnEncoding = " CHARACTER SET ".$charset." COLLATE ".$collate;
669-
$connection->query(
670-
sprintf(
671-
'ALTER TABLE `%s` MODIFY COLUMN `module` varchar(50) %s,
672-
MODIFY COLUMN `schema_version` varchar(50) %s,
673-
MODIFY COLUMN `data_version` varchar(50) %s,
674-
DEFAULT CHARSET=%s, DEFAULT COLLATE=%s',
675-
$setup->getTable('setup_module'),
676-
$columnEncoding,
677-
$columnEncoding,
678-
$columnEncoding,
679-
$charset,
680-
$collate
681-
)
682-
);
666+
$tableName = $setup->getTable('setup_module');
667+
$columns = ['module' => ['varchar(50)',''],
668+
'schema_version' => ['varchar(50)',''],
669+
'data_version' => ['varchar(50)','']];
670+
$this->updateDBTable($tableName, $columns, $connection);
683671
}
684672
}
685673
}
@@ -744,19 +732,9 @@ private function setupSessionTable(
744732
// change the charset to utf8mb4
745733
$getTableSchema = $connection->getCreateTable($setup->getTable('session')) ?? '';
746734
if (str_contains($getTableSchema, self::OLDCHARSET)) {
747-
$charset = $this->columnConfig->getDefaultCharset();
748-
$collate = $this->columnConfig->getDefaultCollation();
749-
$columnEncoding = " CHARACTER SET ".$charset." COLLATE ".$collate;
750-
$connection->query(
751-
sprintf(
752-
'ALTER TABLE `%s` MODIFY COLUMN `session_id` varchar(255) %s ,
753-
DEFAULT CHARSET=%s, DEFAULT COLLATE=%s',
754-
$setup->getTable('session'),
755-
$columnEncoding,
756-
$charset,
757-
$collate
758-
)
759-
);
735+
$tableName = $setup->getTable('session');
736+
$columns = ['session_id' => ['varchar(255)','']];
737+
$this->updateDBTable($tableName, $columns, $connection);
760738
}
761739
}
762740
}
@@ -817,19 +795,9 @@ private function setupCacheTable(
817795
// change the charset to utf8mb4
818796
$getTableSchema = $connection->getCreateTable($setup->getTable('cache')) ?? '';
819797
if (str_contains($getTableSchema, self::OLDCHARSET)) {
820-
$charset = $this->columnConfig->getDefaultCharset();
821-
$collate = $this->columnConfig->getDefaultCollation();
822-
$columnEncoding = " CHARACTER SET ".$charset." COLLATE ".$collate;
823-
$connection->query(
824-
sprintf(
825-
'ALTER TABLE `%s` MODIFY COLUMN `id` varchar(200) %s,
826-
DEFAULT CHARSET=%s, DEFAULT COLLATE=%s',
827-
$setup->getTable('cache'),
828-
$columnEncoding,
829-
$charset,
830-
$collate
831-
)
832-
);
798+
$tableName = $setup->getTable('cache');
799+
$columns = ['id' => ['varchar(200)','']];
800+
$this->updateDBTable($tableName, $columns, $connection);
833801
}
834802
}
835803
}
@@ -872,20 +840,9 @@ private function setupCacheTagTable(
872840
// change the charset to utf8mb4
873841
$getTableSchema = $connection->getCreateTable($setup->getTable('cache_tag')) ?? '';
874842
if (str_contains($getTableSchema, self::OLDCHARSET)) {
875-
$charset = $this->columnConfig->getDefaultCharset();
876-
$collate = $this->columnConfig->getDefaultCollation();
877-
$columnEncoding = " CHARACTER SET ".$charset." COLLATE ".$collate;
878-
$connection->query(
879-
sprintf(
880-
'ALTER TABLE `%s` MODIFY COLUMN `tag` varchar(100) %s,
881-
MODIFY COLUMN `cache_id` varchar(200) %s, DEFAULT CHARSET=%s, DEFAULT COLLATE=%s',
882-
$setup->getTable('cache_tag'),
883-
$columnEncoding,
884-
$columnEncoding,
885-
$charset,
886-
$collate
887-
)
888-
);
843+
$tableName = $setup->getTable('cache_tag');
844+
$columns = ['tag' => ['varchar(100)',''],'cache_id' => ['varchar(200)','']];
845+
$this->updateDBTable($tableName, $columns, $connection);
889846
}
890847
}
891848
}
@@ -948,20 +905,8 @@ private function setupFlagTable(
948905
// change the charset to utf8mb4
949906
$getTableSchema = $connection->getCreateTable($tableName) ?? '';
950907
if (str_contains($getTableSchema, self::OLDCHARSET)) {
951-
$charset = $this->columnConfig->getDefaultCharset();
952-
$collate = $this->columnConfig->getDefaultCollation();
953-
$columnEncoding = " CHARACTER SET ".$charset." COLLATE ".$collate;
954-
$connection->query(
955-
sprintf(
956-
'ALTER TABLE `%s` MODIFY COLUMN `flag_code` varchar(255) %s NOT NULL,
957-
MODIFY COLUMN `flag_data` mediumtext %s, DEFAULT CHARSET=%s, DEFAULT COLLATE=%s',
958-
$setup->getTable('flag'),
959-
$columnEncoding,
960-
$columnEncoding,
961-
$charset,
962-
$collate
963-
)
964-
);
908+
$columns = ['flag_code' => ['varchar(255)','NOT NULL'],'flag_data' => ['mediumtext','']];
909+
$this->updateDBTable($tableName, $columns, $connection);
965910
}
966911
}
967912
}
@@ -1937,4 +1882,25 @@ private function reindexAll(): void
19371882
$this->log->log(__("Indexing Error: ".$e->getMessage()));
19381883
}
19391884
}
1885+
1886+
/**
1887+
* Add column attribute and update table
1888+
*
1889+
* @param string $tableName
1890+
* @param array $columns
1891+
* @param AdapterInterface $connection
1892+
* @return void
1893+
*/
1894+
private function updateDBTable(string $tableName, array $columns, $connection) : void
1895+
{
1896+
$charset = $this->columnConfig->getDefaultCharset();
1897+
$collate = $this->columnConfig->getDefaultCollation();
1898+
$encoding = " CHARACTER SET ".$charset." COLLATE ".$collate;
1899+
$qry = sprintf('ALTER TABLE %s ', $tableName);
1900+
foreach ($columns as $key => $prop) {
1901+
$qry .= "MODIFY COLUMN `$key` $prop[0] $encoding $prop[1], ";
1902+
}
1903+
$qry .= sprintf('DEFAULT CHARSET=%s, DEFAULT COLLATE=%s', $charset, $collate);
1904+
$connection->query($qry);
1905+
}
19401906
}

0 commit comments

Comments
 (0)