<?php/**
* Changes the field maximum length.
*/// Provide field name and length for the field.$field_name="field_url_text";$new_length=500;$field_table='field_data_'.$field_name;$field_revision_table='field_revision_'.$field_name;$field_column=$field_name.'_value';// Alter value field length in fields tabledb_query("ALTER TABLE `{$field_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");// Alter value field length in fields revision tabledb_query("ALTER TABLE `{$field_revision_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");// Update field config with new max length$result=db_query("SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) FROM `field_config` WHERE field_name = '{$field_name}'");$config=$result->fetchField();$config_array=unserialize($config);$config_array['settings']['max_length']=$new_length;$config=serialize($config_array);db_update('field_config')->fields(array('data'=>$config))->condition('field_name',$field_name)->execute();?>
SELECTCAST(`data` ASCHAR(10000) CHARACTERSET utf8)
FROM `field_config` WHERE field_name ='field_text';
a:7:{s:12:"translatable";s:1:"1";s:12:"entity_types";a:0:{}s:8:"settings";a:2:
{s:10:"max_length";s:2:"10";s:17:"field_permissions";a:5:
//a lot more stuff...
UPDATE `field_config`
SET data ='a:7:{...a:2:{s:10:"max_length";s:2:"25";...}'WHERE `field_name` ='field_text'
感谢您的回答。我已经对该行进行了注释,现在我可以修改字段中的值,但是在 sumbit 之后出现以下错误:Attempt to update field Serial No failed: field_sql_storage cannot change the schema for an existing field with data..
如果你得到一个FieldUpdateForbiddenException: cannot change the schema for an existing field with data,你还需要在 上注释掉 L282 modules/field/modules/field_sql_storage/field_sql_storage.module。
/**
* Helper function to change the max length of a text field.
*/functionMYMODULE_change_text_field_max_length($field_name, $new_length) {
$field_table = 'field_data_' . $field_name;
$field_revision_table = 'field_revision_' . $field_name;
$field_column = $field_name . '_value';
// Alter value field length in fields table.db_query("UPDATE `{$field_table}` SET `{$field_column}`=SUBSTR(`{$field_column}`, 0, {$new_length})");
db_query("ALTER TABLE `{$field_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");
// Alter value field length in fields revision table.db_query("UPDATE `{$field_revision_table}` SET `{$field_column}`=SUBSTR(`{$field_column}`, 0, {$new_length})");
db_query("ALTER TABLE `{$field_revision_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )");
// Update field config with new max length.$result = db_query("SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) FROM `field_config` WHERE field_name = '{$field_name}'");
$config = $result->fetchField();
$config_array = unserialize($config);
$config_array['settings']['max_length'] = $new_length;
$config = serialize($config_array);
db_update('field_config')
->fields(array('data' => $config))
->condition('field_name', $field_name)
->execute();
}
/**
* Utility to change the max length of a text field.
*
* @param string $field_name
* Field name.
* @param int $new_length
* Field length in characters.
*
* @throws \DrupalUpdateException
*/functionMYMODULE_change_text_field_max_length($field_name, $new_length) {
// The transaction opens here. $txn = db_transaction();
try {
// Update field content tables with new max length.foreach (['field_data_', 'field_revision_'] as$prefix) {
db_query('
ALTER TABLE {' . $prefix . $field_name . '}
MODIFY ' . $field_name . '_value VARCHAR( ' . $new_length . ' )
');
}
// Update field config record with new max length.$result = db_query("
SELECT CAST(data AS CHAR(10000) CHARACTER SET utf8)
FROM {field_config}
WHERE field_name = :field_name
", [':field_name' => $field_name]
);
$config = $result->fetchField();
if ($config) {
$config_array = unserialize($config);
$config_array['settings']['max_length'] = $new_length;
$new_config = serialize($config_array);
db_update('field_config')
->fields(['data' => $new_config])
->condition('field_name', $field_name)
->execute();
}
}
catch (Exception$e) {
// Something went wrong somewhere, so roll back now.$txn->rollback();
// Allow update to be re-run when errors are fixed.thrownew\DrupalUpdateException(
"Failed to change $field_name field max length: " . $e->getMessage(),
$e->getCode(), $e
);
}
}
注释
备份、删除、更改、恢复
我认为没有简单的方法。
我认为应该工作的一种方法是:备份数据库、删除记录、更改字段大小、从备份中重新导入数据(不是结构)。
神兽史莱克
登录或注册以发表评论
我做了,但它仍然显示
我做了,但它仍然显示错误的值,我还在数据库中查找内容类型,但我找不到它,谁能告诉我 Drupal 7 在数据库中存储此信息(内容类型)的位置?所以我可以检查是否有这个?
谢谢,
登录或注册以发表评论
=-=
节点类型存储在节点类型表中——非核心字段存储在它们自己的表中。
登录或注册以发表评论
我找到了那张桌子,但是那里
我找到了表格,但上面没有任何内容说明字段长度,所以我回到方块 1,所以如果数据库中字段的表格有正确的大小,我怎样才能使我的内容类型为显示/允许这个尺寸,而不是以前的尺寸?
谢谢,
登录或注册以发表评论
=-=
http://drupal.stackexchange.com/questions/8829/how-to-change-the-length-...
登录或注册以发表评论
感谢一百万,这奏效了
感谢一百万,这奏效了。
登录或注册以发表评论
工作与否?
这为您成功解决了http://drupal.stackexchange.com/questions/8829/how-to-change-the-length-... ?
登录或注册以发表评论
解决方法
安装 devel,转到 URL(http://sitename/devel/php)并在文本编辑器中运行代码。
登录或注册以发表评论
谢谢你
有效
登录或注册以发表评论
由于某些原因,这项工作
由于某些原因,这在具有成功消息状态的本地主机(Acquia Dev Stack)上工作,但现在在实时服务器上工作并且没有状态消息。我必须将数据库备份到本地主机,运行代码,然后在线恢复
登录或注册以发表评论
嗨,尼丁 K
嗨,尼丁 K
这也适用于 Drupal 8 吗?谢谢
登录或注册以发表评论
改变任何字段的最大长度
您可以设置 jquery 中任何文件的最大长度
$(".form-item-title input").attr('maxlength','40');
登录或注册以发表评论
来自 https://www.drupal.org/forum/support/post-installation/2014-05-15/change-the-maximum-length-of-a-field
如何更改字段设置的长度?
我曾经为一个网站设置了一个字段的长度限制。现在客户想在该字段中添加更多字符。
我无法从 Drupal 更改最大大小,因为我收到以下错误消息:
但是必须有一个解决方案。我应该在数据库中更改它吗(该字段是由Field-collections模块实现的)?
7
实体
数据库
7个答案 正确答案
Dylan Tack 解决方案是最简单的,但就我个人而言,我喜欢探索 Drupal 数据库的内部区域,看看那里是如何管理事物的。
因此,假设您有一个文本字段,其机器名称是 field_text 的 10 个字符,您希望增加到 25 个字符:
数据将存储在两个表中:field_data_field_text 和 field_revision_field_text
定义存储在 field_config 中用于存储数据,而 field_config_instance 用于该字段的每个实例(标签之类的东西)。
现在让我们做一个小小的心脏手术。
更改数据表列定义:
ALTER TABLE `field_data_field_text` CHANGE `field_text_value` `field_text_value` VARCHAR( 25 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL; ALTER TABLE `field_revision_field_text` CHANGE `field_text_value` `field_text_value` VARCHAR( 25 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL;
更改定义列,这个非常棘手,因为它存储在BLOB中,但这不会阻止您这样做。
SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) FROM `field_config` WHERE field_name = 'field_text';
a:7:{s:12:"translatable";s:1:"1";s:12:"entity_types";a:0:{}s:8:"settings";a:2: {s:10:"max_length";s:2:"10";s:17:"field_permissions";a:5: //a lot more stuff...
UPDATE `field_config` SET data = 'a:7:{...a:2:{s:10:"max_length";s:2:"25";...}' WHERE `field_name` = 'field_text'
刷新缓存。
这是一个 PHP序列化数组,有趣的部分是
s:10:"max_length";s:2:"10";
,这意味着这个数组有一个属性名为max_length
(名称是一个 10 个字符的字符串 - 因此是“s”),其值为 10(这是一个 2 个字符长的字符串)。这很容易,不是吗?更改其值就像用 替换
s:2:"10"
零件一样简单s:2:"25"
。注意:如果您的新值的字符长度较长,则必须相应地调整“s”部分。例如,输入 100 将s:3:"100"
作为 100 的长度为 3 个字符。让我们把这个新值放回数据库中,不要忘记保留整个字符串。
这会给你类似的东西:
剖析这个BLOB的内部结构:
???
利润!
顺便说一下,PhpMyAdmin 有一些设置允许直接修改 BLOB 列,但为什么要走简单的路呢?
PS:这也可以在将一些 PHP 代码放入视图中并由于代码中的错误而获得 WSOD 时挽救您的生命。
ALTER TABLE
不是SELECT TABLE
。此外,您可以使其更清洁,例如:ALTER TABLE field_data_field_text MODIFY field_text_value
...(当您不想更改名称时,MODIFY 就像 CHANGE 一样。而您不想。)function mymodule_update_7100() { $items = array(); _field_maxlength_fix('field_name'); return $items; } function _field_maxlength_fix($field_name, $maxlength = 255) { _alter_field_table($field_name, $maxlength); $data = _get_field_data($field_name); $data = _fix_field_data($data, $maxlength); _update_field_config($data, $field_name); } function _alter_field_table($field_name, $maxlength) { db_query("ALTER TABLE field_data_".$field_name." CHANGE ".$field_name."_value ".$field_name."_value VARCHAR( ".$maxlength." ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL"); db_query("ALTER TABLE field_revision_".$field_name." CHANGE ".$field_name."_value ".$field_name."_value VARCHAR( ".$maxlength." ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL"); } function _get_field_data($field_name) { $qry = "SELECT data FROM field_config WHERE field_name = :field_name"; $result = db_query($qry, array(':field_name' => $field_name))->fetchObject(); return unserialize($result->data); } function _fix_field_data($data, $maxlength) { $data['settings']['max_length'] = (string)$maxlength; return serialize($data); } function _update_field_config($data, $field_name) { $qry = "UPDATE field_config SET data = :data WHERE field_name = :field_name"; db_query($qry, array(':data' => $data, ':field_name' => $field_name)); }
这似乎是当前文本模块的限制。 text_field_settings_form()有这样的评论:“ @todo:如果 $has_data,添加一个只允许 max_length 增加的验证处理程序。”。
作为临时解决方法,您可以
'#disabled' => $has_data
在 modules/field/modules/text/text.module 中的第 77 行左右注释掉。我找不到针对此特定案例的现有问题,但您可以在#372330上提及它。
Attempt to update field Serial No failed: field_sql_storage cannot change the schema for an existing field with data..
FieldUpdateForbiddenException: cannot change the schema for an existing field with data
,你还需要在 上注释掉 L282modules/field/modules/field_sql_storage/field_sql_storage.module
。德鲁巴 7
/** * Helper function to change the max length of a text field. */ function MYMODULE_change_text_field_max_length($field_name, $new_length) { $field_table = 'field_data_' . $field_name; $field_revision_table = 'field_revision_' . $field_name; $field_column = $field_name . '_value'; // Alter value field length in fields table. db_query("UPDATE `{$field_table}` SET `{$field_column}`=SUBSTR(`{$field_column}`, 0, {$new_length})"); db_query("ALTER TABLE `{$field_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )"); // Alter value field length in fields revision table. db_query("UPDATE `{$field_revision_table}` SET `{$field_column}`=SUBSTR(`{$field_column}`, 0, {$new_length})"); db_query("ALTER TABLE `{$field_revision_table}` CHANGE `{$field_column}` `{$field_column}` VARCHAR( {$new_length} )"); // Update field config with new max length. $result = db_query("SELECT CAST(`data` AS CHAR(10000) CHARACTER SET utf8) FROM `field_config` WHERE field_name = '{$field_name}'"); $config = $result->fetchField(); $config_array = unserialize($config); $config_array['settings']['max_length'] = $new_length; $config = serialize($config_array); db_update('field_config') ->fields(array('data' => $config)) ->condition('field_name', $field_name) ->execute(); }
/** * Change max_length of Name field */ function mymodule_update_7002() { MYMODULE_change_text_field_max_length('field_name', 50); }
来源: http: //nathan.rambeck.org/blog/42-modify-drupal-7-text-field-maximum-length
德鲁巴 8
这是@Christopher提出的相同功能的版本:
/** * Utility to change the max length of a text field. * * @param string $field_name * Field name. * @param int $new_length * Field length in characters. * * @throws \DrupalUpdateException */ function MYMODULE_change_text_field_max_length($field_name, $new_length) { // The transaction opens here. $txn = db_transaction(); try { // Update field content tables with new max length. foreach (['field_data_', 'field_revision_'] as $prefix) { db_query(' ALTER TABLE {' . $prefix . $field_name . '} MODIFY ' . $field_name . '_value VARCHAR( ' . $new_length . ' ) '); } // Update field config record with new max length. $result = db_query(" SELECT CAST(data AS CHAR(10000) CHARACTER SET utf8) FROM {field_config} WHERE field_name = :field_name ", [':field_name' => $field_name] ); $config = $result->fetchField(); if ($config) { $config_array = unserialize($config); $config_array['settings']['max_length'] = $new_length; $new_config = serialize($config_array); db_update('field_config') ->fields(['data' => $new_config]) ->condition('field_name', $field_name) ->execute(); } } catch (Exception $e) { // Something went wrong somewhere, so roll back now. $txn->rollback(); // Allow update to be re-run when errors are fixed. throw new \DrupalUpdateException( "Failed to change $field_name field max length: " . $e->getMessage(), $e->getCode(), $e ); } }
drush updb --entity-updates
我们通过这个函数运行的字段时,它会被标记为需要更新。然后它将尝试在 mysql 中再次更新字段模式。对我们来说,这将失败,因为那里已经有现场数据。这阻止了其他更新任务的运行。试试这个...这会将字段数据类型从 TEXT 更新为 LONG_TEXT 并将
max_length
从 4000 更新为最大长文本长度...希望这有帮助。function my_module_update_1001(&$sandbox) { // Check if our field is already created. if (field_info_field('sample_text_field')) { db_query('ALTER TABLE field_data_sample_text_field CHANGE sample_text_field_value sample_text_field_value LONGTEXT'); db_query('ALTER TABLE field_revision_sample_text_field CHANGE sample_text_field_value sample_text_field_value LONGTEXT'); db_query("UPDATE field_config SET type = 'text_long' WHERE field_name = 'sample_text_field' "); $field = array( 'field_name' => 'sample_text_field', 'type' => 'text_long', 'cardinality' => 1, 'settings' => array( 'max_length' => 0, ), ); field_update_field($field); } }
D8
core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorageSchema.php
用文本“SQL 存储无法更改现有字段的模式”注释掉抛出异常的两行。关于第 1312 和 1403 行。在您的浏览器中,导航至
/admin/config/development/configuration/single/export
。配置类型为“字段存储”,并选择有问题的字段。复制配置。导航到
/admin/config/development/configuration/single/import
。. 配置类型为“现场存储”。粘贴配置。改变长度。提交表格。
请注意(您可能已经知道),如果您缩短长度,则现有数据将被截断。
在Drupal 7中,我对phpmyadmin中的2个表进行了修改,并刷新了缓存。
“field_data_field_lorem”:将“field_lorem_value”更改为“longtext”
“field_config”:将“type”更改为“text_long”
或者问你自己的问题。7
实体
数据库
来自 https://drupal.stackexchange.com/questions/8829/how-to-change-the-length-of-field-settings