Index: modules/profile/profile.admin.inc
===================================================================
--- modules/profile/profile.admin.inc	(revision 3)
+++ modules/profile/profile.admin.inc	(working copy)
@@ -206,6 +206,7 @@
     'autocomplete' => '',
     'required' => '',
     'register' => '',
+    'length' => 0,
   );
   $form['fields'] = array('#type' => 'fieldset',
     '#title' => t('Field settings'),
@@ -278,6 +279,11 @@
     '#title' => t('Visible in user registration form.'),
     '#default_value' => $edit['register'],
   );
+  $form['fields']['length'] = array('#type' => 'textfield',
+    '#title' => t('Length'),
+    '#default_value' => $edit['length'],
+    '#description' => t('The character limit of the field. Zero specifies no limit.'),
+  );
   $form['submit'] = array('#type' => 'submit',
     '#value' => t('Save field'),
   );
@@ -339,13 +345,13 @@
     $form_state['values']['page'] = '';
   }
   if (!isset($form_state['values']['fid'])) {
-    db_query("INSERT INTO {profile_fields} (title, name, explanation, category, type, weight, required, register, visibility, autocomplete, options, page) VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s', '%s')", $form_state['values']['title'], $form_state['values']['name'], $form_state['values']['explanation'], $form_state['values']['category'], $form_state['values']['type'], $form_state['values']['weight'], $form_state['values']['required'], $form_state['values']['register'], $form_state['values']['visibility'], $form_state['values']['autocomplete'], $form_state['values']['options'], $form_state['values']['page']);
+    db_query("INSERT INTO {profile_fields} (title, name, explanation, category, type, weight, required, register, visibility, autocomplete, options, page, length) VALUES ('%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, '%s', '%s', %d)", $form_state['values']['title'], $form_state['values']['name'], $form_state['values']['explanation'], $form_state['values']['category'], $form_state['values']['type'], $form_state['values']['weight'], $form_state['values']['required'], $form_state['values']['register'], $form_state['values']['visibility'], $form_state['values']['autocomplete'], $form_state['values']['options'], $form_state['values']['page'], $form_state['values']['length']);
 
     drupal_set_message(t('The field has been created.'));
     watchdog('profile', 'Profile field %field added under category %category.', array('%field' => $form_state['values']['title'], '%category' => $form_state['values']['category']), WATCHDOG_NOTICE, l(t('view'), 'admin/user/profile'));
   }
   else {
-    db_query("UPDATE {profile_fields} SET title = '%s', name = '%s', explanation = '%s', category = '%s', weight = %d, required = %d, register = %d, visibility = %d, autocomplete = %d, options = '%s', page = '%s' WHERE fid = %d", $form_state['values']['title'], $form_state['values']['name'], $form_state['values']['explanation'], $form_state['values']['category'], $form_state['values']['weight'], $form_state['values']['required'], $form_state['values']['register'], $form_state['values']['visibility'], $form_state['values']['autocomplete'], $form_state['values']['options'], $form_state['values']['page'], $form_state['values']['fid']);
+    db_query("UPDATE {profile_fields} SET title = '%s', name = '%s', explanation = '%s', category = '%s', weight = %d, required = %d, register = %d, visibility = %d, autocomplete = %d, options = '%s', page = '%s', length = %d WHERE fid = %d", $form_state['values']['title'], $form_state['values']['name'], $form_state['values']['explanation'], $form_state['values']['category'], $form_state['values']['weight'], $form_state['values']['required'], $form_state['values']['register'], $form_state['values']['visibility'], $form_state['values']['autocomplete'], $form_state['values']['options'], $form_state['values']['page'], $form_state['values']['length'], $form_state['values']['fid']);
 
     drupal_set_message(t('The field has been updated.'));
   }
Index: modules/profile/profile.module
===================================================================
--- modules/profile/profile.module	(revision 3)
+++ modules/profile/profile.module	(working copy)
@@ -439,6 +439,9 @@
           form_set_error($field->name, t('The value provided for %field is not a valid URL.', array('%field' => $field->title)));
         }
       }
+      if ($field->length && ($field->length < strlen($edit[$field->name]))) {
+        form_set_error($field->name, t('The field %field is beyond the character limit of %length.', array('%field' => $field->title, '%length' => $field->length)));
+      }
     }
     else if ($field->required && !user_access('administer users')) {
       form_set_error($field->name, t('The field %field is required.', array('%field' => $field->title)));
Index: modules/profile/profile.install
===================================================================
--- modules/profile/profile.install	(revision 3)
+++ modules/profile/profile.install	(working copy)
@@ -107,6 +107,13 @@
         'not null' => FALSE,
         'description' => t('List of options to be used in a list selection field.'),
       ),
+      'length' => array(
+      	'type' => 'int',
+	'not null' => TRUE,
+	'default' => 0,
+	'size' => 'tiny',
+	'description' => t('The size of the field, only applicable to text boxes'),
+      ),
     ),
     'indexes' => array('category' => array('category')),
     'unique keys' => array('name' => array('name')),
@@ -145,3 +152,16 @@
   return $schema;
 }
 
+function profile_update_6000() {
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysqli':
+    case 'mysql':
+      $ret[] = update_sql("ALTER TABLE {profile_fields} ADD COLUMN length integer NOT NULL default 0");
+      break;
+    case 'pgsql':
+      db_add_column($ret, 'profile_fields', 'length', 'integer', array('default' => 0, 'not null' => TRUE));
+      break;
+  }
+  return $ret;
+}
