# Noob Question - Migrations

**URL:** <https://www.ruby-forum.com/t/noob-question-migrations/133779>\
**Category:** Rails\
**Created:** [April 3, 2008, 3:00pm UTC](https://www.ruby-forum.com/t/noob-question-migrations/133779 "2008-04-03T15:00:55Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Rory\_McKinley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/6bbea6/32.png) [@Rory\_McKinley](https://www.ruby-forum.com/u/Rory_McKinley)\
**Post date:** [April 3, 2008, 3:00pm UTC](https://www.ruby-forum.com/t/noob-question-migrations/133779/1 "2008-04-03T15:00:55Z")

</div>

Hello list

If I am using migrations to build my Db schema, is there any way to  
generate fixed-length fields for MySQL (i.e. char instead of varchar). I  
have tried STFW, but have come back with nothing to say that it is  
possible, but nothing that conclusively states it is impossible.

Thanks

---

<div class="post-metadata">

**Author:** ![Rory\_McKinley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/6bbea6/32.png) [@Rory\_McKinley](https://www.ruby-forum.com/u/Rory_McKinley)\
**Post date:** [April 3, 2008, 3:11pm UTC](https://www.ruby-forum.com/t/noob-question-migrations/133779/2 "2008-04-03T15:11:34Z")

</div>

t.column :fieldname, :string, :limit =\> 10

On Thu, Apr 3, 2008 at 11:30 PM, Rory McKinley  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> >

–  
Ryan B.

> **[frozenplague.net](http://www.frozenplague.net)**
>
> This domain may be for sale!

Feel free to add me to MSN and/or GTalk as this email.

---

<div class="post-metadata">

**Author:** ![Rory\_McKinley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/6bbea6/32.png) [@Rory\_McKinley](https://www.ruby-forum.com/u/Rory_McKinley)\
**Post date:** [April 3, 2008, 4:40pm UTC](https://www.ruby-forum.com/t/noob-question-migrations/133779/3 "2008-04-03T16:40:59Z")

</div>

Ryan B. (Radar) wrote:

> t.column :fieldname, :string, :limit =\> 10

Thanks Ryan

But if I read my docs correctly - wouldn’t that create a VARCHAR(10)?  
When what I need is a CHAR(10).

Regards

Rory

---

<div class="post-metadata">

**Author:** ![Rory\_McKinley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/6bbea6/32.png) [@Rory\_McKinley](https://www.ruby-forum.com/u/Rory_McKinley)\
**Post date:** [April 4, 2008, 7:36am UTC](https://www.ruby-forum.com/t/noob-question-migrations/133779/4 "2008-04-04T07:36:31Z")

</div>

I just tried doing t.column :fieldname, :char, :limit =\> 10 and it  
worked  
for me, you might as well give it a shot too.

On Fri, Apr 4, 2008 at 1:09 AM, Rory McKinley  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Regards
> 
> Rory
> 
> >

–  
Ryan B.

> **[frozenplague.net](http://www.frozenplague.net)**
>
> This domain may be for sale!

Feel free to add me to MSN and/or GTalk as this email.

---

<div class="post-metadata">

**Author:** ![Rory\_McKinley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/6bbea6/32.png) [@Rory\_McKinley](https://www.ruby-forum.com/u/Rory_McKinley)\
**Post date:** [April 4, 2008, 8:51am UTC](https://www.ruby-forum.com/t/noob-question-migrations/133779/5 "2008-04-04T08:51:55Z")

</div>

Ryan B. (Radar) wrote:

> I just tried doing t.column :fieldname, :char, :limit =\> 10 and it worked  
> for me, you might as well give it a shot too.

Hi Ryan

Unfortunately, it didn’t work for me:

A migration script that looks like this:

create\_table(:users, :options=\> ‘ENGINE MyISAM DEFAULT CHARACTER SET  
UTF8’) do |t|  
t.column :first\_name, :char, :limit =\> 10, :null =\> false  
t.column :last\_name, :char, :limit =\> 10, :null =\> false  
t.column :permission\_goal\_super, :boolean, :null =\> false  
t.column :permission\_milestone\_super, :boolean, :null =\> false  
end

Produces a table that looks like this:

CREATE TABLE `users` (  
`id` int(11) NOT NULL auto\_increment,  
`first_name` char(1) NOT NULL,  
`last_name` char(1) NOT NULL,  
`permission_goal_super` tinyint(1) NOT NULL,  
`permission_milestone_super` tinyint(1) NOT NULL,  
PRIMARY KEY (`id`)  
) ENGINE=MyISAM DEFAULT CHARSET=utf8

It seems that if you use :char you are limited to exactly that - a  
character ;).

One workaround I have found is to manually add character columns post  
creation using the execute method.

---

<div class="post-metadata">

**Author:** ![Rory\_McKinley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/6bbea6/32.png) [@Rory\_McKinley](https://www.ruby-forum.com/u/Rory_McKinley)\
**Post date:** [April 4, 2008, 12:26pm UTC](https://www.ruby-forum.com/t/noob-question-migrations/133779/6 "2008-04-04T12:26:38Z")

</div>

Why must it be a char field type? surely varchars are just as good,  
unless  
it’s a life-or-death situation to making your database as small as  
possible.

On Fri, Apr 4, 2008 at 5:20 PM, Rory McKinley  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Produces a table that looks like this:  
> It seems that if you use :char you are limited to exactly that - a  
> character ;).
> 
> One workaround I have found is to manually add character columns post  
> creation using the execute method.
> 
> >

–  
Ryan B.

> **[frozenplague.net](http://www.frozenplague.net)**
>
> This domain may be for sale!

Feel free to add me to MSN and/or GTalk as this email.

---

<div class="post-metadata">

**Author:** ![Rory\_McKinley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/6bbea6/32.png) [@Rory\_McKinley](https://www.ruby-forum.com/u/Rory_McKinley)\
**Post date:** [April 4, 2008, 2:13pm UTC](https://www.ruby-forum.com/t/noob-question-migrations/133779/7 "2008-04-04T14:13:04Z")

</div>

Fair enough. Glad to see you found your own solution. 🙂

On Fri, Apr 4, 2008 at 9:19 PM, Rory McKinley  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Actually, varchars in mysql will on average use less space than a char  
> field, unless you are maxing out your field length every time. But,  
> varchars infer performance penalties when used as part of an index. From  
> a DB design POV, it is a good idea to minimise the use of varchars.
> 
> I worked around, by using execute - works like a charm!
> 
> >

–  
Ryan B.

> **[frozenplague.net](http://www.frozenplague.net)**
>
> This domain may be for sale!

Feel free to add me to MSN and/or GTalk as this email.

---

<div class="post-metadata">

**Author:** ![Rory\_McKinley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/6bbea6/32.png) [@Rory\_McKinley](https://www.ruby-forum.com/u/Rory_McKinley)\
**Post date:** [April 4, 2008, 12:50pm UTC](https://www.ruby-forum.com/t/noob-question-migrations/133779/8 "2008-04-04T12:50:19Z")

</div>

Ryan B. (Radar) wrote:

> Why must it be a char field type? surely varchars are just as good, unless  
> it’s a life-or-death situation to making your database as small as possible.

Hi Ryan

Actually, varchars in mysql will on average use less space than a char  
field, unless you are maxing out your field length every time. But,  
varchars infer performance penalties when used as part of an index. From  
a DB design POV, it is a good idea to minimise the use of varchars.

I worked around, by using execute - works like a charm!
