reverted: --- b/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php +++ a/core/lib/Drupal/Core/Database/Driver/mysql/Connection.php @@ -64,7 +64,7 @@ // Character set is added to dsn to ensure PDO uses the proper character // set when escaping. This has security implications. See // https://www.drupal.org/node/1201452 for further discussion. + $dsn .= ';charset=utf8'; - $dsn .= ';charset=utf8mb4'; if (!empty($connection_options['database'])) { $dsn .= ';dbname=' . $connection_options['database']; } @@ -92,13 +92,13 @@ $pdo = new \PDO($dsn, $connection_options['username'], $connection_options['password'], $connection_options['pdo']); // Force MySQL to use the UTF-8 character set. Also set the collation, if a + // certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci' + // for UTF-8. - // certain one has been set; otherwise, MySQL defaults to - // 'utf8mb4_general_ci' for utf8mb4. if (!empty($connection_options['collation'])) { + $pdo->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']); - $pdo->exec('SET NAMES utf8mb4 COLLATE ' . $connection_options['collation']); } else { + $pdo->exec('SET NAMES utf8'); - $pdo->exec('SET NAMES utf8mb4'); } // Set MySQL init_commands if not already defined. Default Drupal's MySQL reverted: --- b/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php +++ a/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php @@ -87,7 +87,7 @@ // Provide defaults if needed. $table += array( 'mysql_engine' => 'InnoDB', + 'mysql_character_set' => 'utf8', - 'mysql_character_set' => 'utf8mb4', ); $sql = "CREATE TABLE {" . $name . "} (\n"; @@ -108,8 +108,8 @@ $sql .= 'ENGINE = ' . $table['mysql_engine'] . ' DEFAULT CHARACTER SET ' . $table['mysql_character_set']; // By default, MySQL uses the default collation for new tables, which is + // 'utf8_general_ci' for utf8. If an alternate collation has been set, it + // needs to be explicitly specified. - // 'utf8mb4_general_ci' for utf8mb4. If an alternate collation has been - // set, it needs to be explicitly specified. // @see DatabaseConnection_mysql if (!empty($info['collation'])) { $sql .= ' COLLATE ' . $info['collation']; reverted: --- b/core/modules/aggregator/src/FeedStorageSchema.php +++ a/core/modules/aggregator/src/FeedStorageSchema.php @@ -33,7 +33,7 @@ break; case 'title': + $this->addSharedTableFieldUniqueKey($storage_definition, $schema); - $this->addSharedTableFieldIndex($storage_definition, $schema, TRUE); break; } } reverted: --- /dev/null +++ a/core/modules/block_content/src/BlockContentStorageSchema.php @@ -0,0 +1,52 @@ + array('info', 'langcode'), + ); + + return $schema; + } + + /** + * {@inheritdoc} + */ + protected function getSharedTableFieldSchema(FieldStorageDefinitionInterface $storage_definition, $table_name, array $column_mapping) { + $schema = parent::getSharedTableFieldSchema($storage_definition, $table_name, $column_mapping); + $field_name = $storage_definition->getName(); + + if ($table_name == 'block_content_field_data') { + switch ($field_name) { + case 'info': + // Improves the performance of the block_content__info index defined + // in getEntitySchema(). + $schema['fields'][$field_name]['not null'] = TRUE; + break; + } + } + + return $schema; + } + +} reverted: --- b/core/modules/block_content/src/Entity/BlockContent.php +++ a/core/modules/block_content/src/Entity/BlockContent.php @@ -23,6 +23,7 @@ * bundle_label = @Translation("Custom block type"), * handlers = { * "storage" = "Drupal\Core\Entity\Sql\SqlContentEntityStorage", + * "storage_schema" = "Drupal\block_content\BlockContentStorageSchema", * "access" = "Drupal\block_content\BlockContentAccessControlHandler", * "list_builder" = "Drupal\block_content\BlockContentListBuilder", * "view_builder" = "Drupal\block_content\BlockContentViewBuilder", reverted: --- b/core/modules/file/src/Entity/File.php +++ a/core/modules/file/src/Entity/File.php @@ -252,8 +252,7 @@ ->setLabel(t('URI')) ->setDescription(t('The URI to access the file (either local or remote).')) ->setSetting('max_length', 255) + ->setSetting('case_sensitive', TRUE); - ->setSetting('case_sensitive', TRUE) - ->addConstraint('FileUriUnique'); $fields['filemime'] = BaseFieldDefinition::create('string') ->setLabel(t('File MIME type')) reverted: --- b/core/modules/file/src/FileStorageSchema.php +++ a/core/modules/file/src/FileStorageSchema.php @@ -30,7 +30,7 @@ break; case 'uri': + $this->addSharedTableFieldUniqueKey($storage_definition, $schema, TRUE); - $this->addSharedTableFieldIndex($storage_definition, $schema, TRUE); break; } } reverted: --- b/core/modules/file/src/Plugin/Validation/Constraint/FileUriUnique.php +++ /dev/null @@ -1,31 +0,0 @@ - 1, 'filename' => 'DRUPLICON.txt', 'uri' => 'public://DRUPLICON.txt', 'filemime' => 'text/plain', 'status' => FILE_STATUS_PERMANENT, + )); - ); - $uppercase_file = File::create($uppercase_values); file_put_contents($uppercase_file->getFileUri(), 'hello world'); - $violations = $uppercase_file->validate(); - $this->assertEqual(count($violations), 0, 'No violations when adding an URI with an existing filename in upper case.'); $uppercase_file->save(); - // Ensure the database URI uniqueness constraint is triggered. - $uppercase_file_duplicate = File::create($uppercase_values); - file_put_contents($uppercase_file_duplicate->getFileUri(), 'hello world'); - $violations = $uppercase_file_duplicate->validate(); - $this->assertEqual(count($violations), 1); - $this->assertEqual($violations[0]->getMessage(), t('The file %value already exists. Enter a unique file URI.', [ - '%value' => $uppercase_file_duplicate->getFileUri(), - ])); // Ensure that file URI entity queries are case sensitive. $fids = \Drupal::entityQuery('file') ->condition('uri', $uppercase_file->getFileUri()) reverted: --- b/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php +++ a/core/modules/migrate/src/Plugin/migrate/id_map/Sql.php @@ -261,12 +261,6 @@ foreach ($this->migration->getSourcePlugin()->getIds() as $id_definition) { $mapkey = 'sourceid' . $count++; $source_id_schema[$mapkey] = $this->getFieldSchema($id_definition); - - // With InnoDB, utf8mb4-based primary keys can't be over 191 characters. - // Use ASCII-based primary keys instead. - if (isset($source_id_schema[$mapkey]['type']) && $source_id_schema[$mapkey]['type'] == 'varchar') { - $source_id_schema[$mapkey]['type'] = 'varchar_ascii'; - } $pks[] = $mapkey; } reverted: --- b/core/modules/migrate_drupal/src/Tests/Table/d6/System.php +++ a/core/modules/migrate_drupal/src/Tests/Table/d6/System.php @@ -26,7 +26,7 @@ ), 'fields' => array( 'filename' => array( + 'type' => 'varchar', - 'type' => 'varchar_ascii', 'not null' => TRUE, 'length' => '255', 'default' => '', @@ -916,4 +916,4 @@ } } +#8867fc0eccc6c8439bff0a269ec597ae -#e15f00f5d9b1c571ee015c40f8fc7b00 reverted: --- b/core/modules/node/src/Tests/NodeViewTest.php +++ a/core/modules/node/src/Tests/NodeViewTest.php @@ -33,16 +33,4 @@ $this->assertEqual($result[0]['href'], $node->url()); } - /** - * Tests that we store and retrieve multi-byte UTF-8 characters correctly. - */ - public function testMultiByteUtf8() { - $title = '🐝'; - $this->assertTrue(mb_strlen($title, 'utf-8') < strlen($title), 'Title has multi-byte characters.'); - $node = $this->drupalCreateNode(array('title' => $title)); - $this->drupalGet($node->urlInfo()); - $result = $this->xpath('//span[contains(@class, "field-name-title")]'); - $this->assertEqual((string) $result[0], $title, 'The passed title was returned.'); - } - } reverted: --- b/core/modules/system/src/Tests/Database/RegressionTest.php +++ a/core/modules/system/src/Tests/Database/RegressionTest.php @@ -26,16 +26,16 @@ */ function testRegression_310447() { // That's a 255 character UTF-8 string. + $name = str_repeat("é", 255); - $job = str_repeat("é", 255); db_insert('test') ->fields(array( + 'name' => $name, - 'name' => $this->randomMachineName(), 'age' => 20, + 'job' => 'Dancer', - 'job' => $job, ))->execute(); + $from_database = db_query('SELECT name FROM {test} WHERE name = :name', array(':name' => $name))->fetchField(); + $this->assertIdentical($name, $from_database, 'The database handles UTF-8 characters cleanly.'); - $from_database = db_query('SELECT job FROM {test} WHERE job = :job', array(':job' => $job))->fetchField(); - $this->assertIdentical($job, $from_database, 'The database handles UTF-8 characters cleanly.'); } /** reverted: --- b/core/modules/system/src/Tests/Database/SchemaTest.php +++ a/core/modules/system/src/Tests/Database/SchemaTest.php @@ -72,7 +72,7 @@ $columns = db_query('SHOW FULL COLUMNS FROM {test_table}'); foreach ($columns as $column) { if ($column->Field == 'test_field_string') { + $string_check = ($column->Collation == 'utf8_general_ci'); - $string_check = ($column->Collation == 'utf8mb4_general_ci'); } if ($column->Field == 'test_field_string_ascii') { $string_ascii_check = ($column->Collation == 'ascii_general_ci'); reverted: --- b/core/modules/system/tests/modules/database_test/database_test.install +++ a/core/modules/system/tests/modules/database_test/database_test.install @@ -24,7 +24,7 @@ ), 'name' => array( 'description' => "A person's name", + 'type' => 'varchar', - 'type' => 'varchar_ascii', 'length' => 255, 'not null' => TRUE, 'default' => '', @@ -75,7 +75,7 @@ ), 'job' => array( 'description' => "The person's job", + 'type' => 'varchar', - 'type' => 'varchar_ascii', 'length' => 255, 'not null' => TRUE, 'default' => '', @@ -106,7 +106,7 @@ ), 'job' => array( 'description' => "The person's job", + 'type' => 'varchar', - 'type' => 'varchar_ascii', 'length' => 255, 'not null' => TRUE, 'default' => '', @@ -197,7 +197,7 @@ ), 'name' => array( 'description' => "A person's name.", + 'type' => 'varchar', - 'type' => 'varchar_ascii', 'length' => 255, 'not null' => FALSE, 'default' => '', @@ -228,7 +228,7 @@ ), 'name' => array( 'description' => "A person's name.", + 'type' => 'varchar', - 'type' => 'varchar_ascii', 'length' => 255, 'not null' => FALSE, 'default' => '', reverted: --- b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestStringId.php +++ a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestStringId.php @@ -45,10 +45,7 @@ $fields['id'] = BaseFieldDefinition::create('string') ->setLabel(t('ID')) ->setDescription(t('The ID of the test entity.')) + ->setReadOnly(TRUE); - ->setReadOnly(TRUE) - // In order to work around the InnoDB 191 character limit on utf8mb4 - // primary keys, we set the character set for the field to ASCII. - ->setSetting('is_ascii', TRUE); return $fields; } reverted: --- b/core/modules/user/src/UserStorageSchema.php +++ a/core/modules/user/src/UserStorageSchema.php @@ -52,9 +52,6 @@ // Improves the performance of the user__name index defined // in getEntitySchema(). $schema['fields'][$field_name]['not null'] = TRUE; - // Make sure the field is no longer than 191 characters so we can - // add a unique constraint in MySQL. - $schema['fields'][$field_name]['length'] = USERNAME_MAX_LENGTH; break; case 'mail': reverted: --- b/core/modules/user/user.module +++ a/core/modules/user/user.module @@ -25,8 +25,6 @@ /** * Maximum length of username text field. - * - * Keep this under 191 characters so we can use a unique constraint in MySQL. */ const USERNAME_MAX_LENGTH = 60; reverted: --- b/core/modules/views/src/Tests/ViewTestData.php +++ a/core/modules/views/src/Tests/ViewTestData.php @@ -75,7 +75,7 @@ ), 'name' => array( 'description' => "A person's name", + 'type' => 'varchar', - 'type' => 'varchar_ascii', 'length' => 255, 'not null' => TRUE, 'default' => '', reverted: --- b/core/scripts/dump-database-d6.sh +++ a/core/scripts/dump-database-d6.sh @@ -53,11 +53,6 @@ $schema = drupal_get_schema(); ksort($schema); -// Override the field type of the filename primary key to bypass the -// InnoDB 191 character limitation. -if (isset($schema['system']['primary key']) && $schema['system']['primary key'] == 'filename' && isset($schema['system']['fields']['filename']['type']) && $schema['system']['fields']['filename']['type'] == 'varchar') { - $schema['system']['fields']['filename']['type'] = 'varchar_ascii'; -} // Export all the tables in the schema. foreach ($schema as $table => $data) { // Remove descriptions to save time and code. reverted: --- b/core/tests/Drupal/Tests/Core/Routing/RoutingFixtures.php +++ a/core/tests/Drupal/Tests/Core/Routing/RoutingFixtures.php @@ -176,7 +176,7 @@ 'fields' => array( 'name' => array( 'description' => 'Primary Key: Machine name of this route', + 'type' => 'varchar', - 'type' => 'varchar_ascii', 'length' => 255, 'not null' => TRUE, 'default' => '', reverted: --- b/sites/default/default.settings.php +++ a/sites/default/default.settings.php @@ -75,7 +75,7 @@ * 'host' => 'localhost', * 'port' => 3306, * 'prefix' => 'myprefix_', + * 'collation' => 'utf8_general_ci', - * 'collation' => 'utf8mb4_general_ci', * ); * @endcode * @@ -127,7 +127,7 @@ * 'password' => 'password', * 'host' => 'localhost', * 'prefix' => 'main_', + * 'collation' => 'utf8_general_ci', - * 'collation' => 'utf8mb4_general_ci', * ); * @endcode *