[BUGFIX] "Illegal mix of collations" in Upgrade Wizard 17/32117/6
authorLars Trebing <lars@trebing.name>
Tue, 12 Aug 2014 15:20:58 +0000 (17:20 +0200)
committerJigal van Hemert <jigal.van.hemert@typo3.org>
Fri, 15 Aug 2014 18:49:06 +0000 (20:49 +0200)
When directly comparing CAST(... AS CHAR) with a CHAR field (including
VARCHAR and TEXT) whose collation isn't the same as that of the database
connection, MySQL gives an error like this:

> Illegal mix of collations (utf8_general_ci,IMPLICIT) and
> (utf8_unicode_ci,IMPLICIT) for operation '<>'

Wrapping the right side of the comparison in CAST(... AS CHAR) as well
keeps the data unchanged while ensuring that both sides have the same
collation.

Change-Id: Icaec66412d6b6441ae30065ffb92565991e9a1e4
Resolves: #36754
Releases: 6.3, 6.2
Reviewed-on: http://review.typo3.org/32117
Reviewed-by: Markus Klein <klein.t3@reelworx.at>
Tested-by: Markus Klein <klein.t3@reelworx.at>
Reviewed-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
Tested-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
typo3/sysext/install/Classes/Updates/TceformsUpdateWizard.php
typo3/sysext/install/Classes/Updates/TtContentUploadsUpdateWizard.php

index 5bd478b..38389a3 100644 (file)
@@ -228,7 +228,7 @@ class TceformsUpdateWizard extends AbstractUpdate {
                        : '';
                $where = $fieldToMigrate . ' IS NOT NULL'
                        . ' AND ' . $fieldToMigrate . ' != \'\''
-                       . ' AND CAST(CAST(' . $fieldToMigrate . ' AS DECIMAL) AS CHAR) <> ' . $fieldToMigrate
+                       . ' AND CAST(CAST(' . $fieldToMigrate . ' AS DECIMAL) AS CHAR) <> CAST(' . $fieldToMigrate . ' AS CHAR)'
                        . $deletedCheck;
                $result = $this->database->exec_SELECTgetRows($fields, $table, $where, '', '', $limit);
                if ($result === NULL) {
index 1bad136..ee2a6bd 100644 (file)
@@ -260,7 +260,7 @@ class TtContentUploadsUpdateWizard extends AbstractUpdate {
                $this->quoteIdentifiers($mapping);
 
                $where = sprintf(
-                       'WHERE %s <> \'\' AND CAST(CAST(%s AS DECIMAL) AS CHAR) <> %s OR (%s = \'uploads\' AND %s != \'\')',
+                       'WHERE %s <> \'\' AND CAST(CAST(%s AS DECIMAL) AS CHAR) <> CAST(%s AS CHAR) OR (%s = \'uploads\' AND %s != \'\')',
                        $mapping['mapFieldNames']['media'],
                        $mapping['mapFieldNames']['media'],
                        $mapping['mapFieldNames']['media'],