diff --git a/core/config/schema/core.data_types.schema.yml b/core/config/schema/core.data_types.schema.yml index cc89fa9..55de923 100644 --- a/core/config/schema/core.data_types.schema.yml +++ b/core/config/schema/core.data_types.schema.yml @@ -445,6 +445,9 @@ field.storage_settings.string: case_sensitive: type: boolean label: 'Case sensitive' + ascii: + type: boolean + label: 'US ASCII characters only' field.field_settings.string: type: mapping diff --git a/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php b/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php index d0aba49..0f7f57b 100644 --- a/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php +++ b/core/lib/Drupal/Core/Database/Driver/mysql/Schema.php @@ -144,6 +144,9 @@ protected function createFieldSql($name, $spec) { if (!empty($spec['binary'])) { $sql .= ' BINARY'; } + if (!empty($spec['ascii'])) { + $sql .= ' CHARACTER SET ascii COLLATE ascii_general_ci'; + } } elseif (isset($spec['precision']) && isset($spec['scale'])) { $sql .= '(' . $spec['precision'] . ', ' . $spec['scale'] . ')'; diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php index 8817c87..0340417 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItem.php @@ -45,6 +45,7 @@ public static function schema(FieldStorageDefinitionInterface $field_definition) 'type' => 'varchar', 'length' => (int) $field_definition->getSetting('max_length'), 'binary' => $field_definition->getSetting('case_sensitive'), + 'ascii' => $field_definition->getSetting('ascii'), ), ), ); diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItemBase.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItemBase.php index 4772983..eb602ed 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItemBase.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItemBase.php @@ -23,6 +23,7 @@ public static function defaultStorageSettings() { return array( 'case_sensitive' => FALSE, + 'ascii' => FALSE, ) + parent::defaultStorageSettings(); } @@ -35,6 +36,7 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel $properties['value'] = DataDefinition::create('string') ->setLabel(new TranslationWrapper('Text value')) ->setSetting('case_sensitive', $field_definition->getSetting('case_sensitive')) + ->setSetting('ascii', $field_definition->getSetting('ascii')) ->setRequired(TRUE); return $properties; diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php index e787029..02eaebe 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/UuidItem.php @@ -29,6 +29,7 @@ class UuidItem extends StringItem { public static function defaultStorageSettings() { return array( 'max_length' => 128, + 'ascii' => TRUE, ) + parent::defaultStorageSettings(); } diff --git a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php index 5570a2a..b48e985 100644 --- a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php +++ b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php @@ -250,6 +250,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { ->setLabel(t('Bundle')) ->setDescription(t('The content menu link bundle.')) ->setSetting('max_length', EntityTypeInterface::BUNDLE_MAX_LENGTH) + ->setSetting('ascii', TRUE) ->setReadOnly(TRUE); $fields['title'] = BaseFieldDefinition::create('string') @@ -291,7 +292,8 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { $fields['menu_name'] = BaseFieldDefinition::create('string') ->setLabel(t('Menu name')) ->setDescription(t('The menu name. All links with the same menu name (such as "tools") are part of the same menu.')) - ->setDefaultValue('tools'); + ->setDefaultValue('tools') + ->setSetting('ascii', TRUE); $fields['link'] = BaseFieldDefinition::create('link') ->setLabel(t('Link')) diff --git a/core/modules/system/src/Tests/Database/SchemaTest.php b/core/modules/system/src/Tests/Database/SchemaTest.php index a59b9d9..f8578be 100644 --- a/core/modules/system/src/Tests/Database/SchemaTest.php +++ b/core/modules/system/src/Tests/Database/SchemaTest.php @@ -49,6 +49,11 @@ function testSchema() { 'default' => "'\"funky default'\"", 'description' => 'Schema column description for string.', ), + 'test_field_string_ascii' => array( + 'type' => 'varchar', + 'ascii' => TRUE, + 'description' => 'Schema column description for ASCII string.', + ), ), ); db_create_table('test_table', $table_specification); @@ -62,6 +67,17 @@ function testSchema() { // Assert that the column comment has been set. $this->checkSchemaComment($table_specification['fields']['test_field']['description'], 'test_table', 'test_field'); + // Make sure that varchard fields have the correct collation. + $columns = db_query('SHOW FULL COLUMNS FROM {test_table}'); + foreach ($columns as $column) { + if ($column->Field == 'test_field_string') { + $this->assertTrue($column->Collation == 'utf8_general_ci'); + } + if ($column->Field == 'test_field_string_ascii') { + $this->assertTrue($column->Collation == 'ascii_general_ci'); + } + } + // An insert without a value for the column 'test_table' should fail. $this->assertFalse($this->tryInsert(), 'Insert without a default failed.');