Is MySQL Picky About Reserved Words?
------------------------------------
A common problem stems from trying to create a table with column names
that use the names of datatypes or functions built into MySQL, such as
`TIMESTAMP' or `GROUP'. You're allowed to do it (for example, `ABS' is
an allowed column name), but whitespace is not allowed between a
function name and the `(' when using functions whose names are also
column names.
The following words are explicitly reserved in MySQL. Most of them are
forbidden by ANSI SQL92 as column and/or table names (for example,
`group'). A few are reserved because MySQL needs them and is
(currently) using a `yacc' parser:
`action' `add' `aggregate' `all'
`alter' `after' `and' `as'
`asc' `avg' `avg_row_length' `auto_increment'
`between' `bigint' `bit' `binary'
`blob' `bool' `both' `by'
`cascade' `case' `char' `character'
`change' `check' `checksum' `column'
`columns' `comment' `constraint' `create'
`cross' `current_date' `current_time' `current_timestamp'
`data' `database' `databases' `date'
`datetime' `day' `day_hour' `day_minute'
`day_second' `dayofmonth' `dayofweek' `dayofyear'
`dec' `decimal' `default' `delayed'
`delay_key_write' `delete' `desc' `describe'
`distinct' `distinctrow' `double' `drop'
`end' `else' `escape' `escaped'
`enclosed' `enum' `explain' `exists'
`fields' `file' `first' `float'
`float4' `float8' `flush' `foreign'
`from' `for' `full' `function'
`global' `grant' `grants' `group'
`having' `heap' `high_priority' `hour'
`hour_minute' `hour_second' `hosts' `identified'
`ignore' `in' `index' `infile'
`inner' `insert' `insert_id' `int'
`integer' `interval' `int1' `int2'
`int3' `int4' `int8' `into'
`if' `is' `isam' `join'
`key' `keys' `kill' `last_insert_id'
`leading' `left' `length' `like'
`lines' `limit' `load' `local'
`lock' `logs' `long' `longblob'
`longtext' `low_priority' `max' `max_rows'
`match' `mediumblob' `mediumtext' `mediumint'
`middleint' `min_rows' `minute' `minute_second'
`modify' `month' `monthname' `myisam'
`natural' `numeric' `no' `not'
`null' `on' `optimize' `option'
`optionally' `or' `order' `outer'
`outfile' `pack_keys' `partial' `password'
`precision' `primary' `procedure' `process'
`processlist' `privileges' `read' `real'
`references' `reload' `regexp' `rename'
`replace' `restrict' `returns' `revoke'
`rlike' `row' `rows' `second'
`select' `set' `show' `shutdown'
`smallint' `soname' `sql_big_tables' `sql_big_selects'
`sql_low_priority_updates'`sql_log_off' `sql_log_update' `sql_select_limit'
`sql_small_result' `sql_big_result' `sql_warnings' `straight_join'
`starting' `status' `string' `table'
`tables' `temporary' `terminated' `text'
`then' `time' `timestamp' `tinyblob'
`tinytext' `tinyint' `trailing' `to'
`type' `use' `using' `unique'
`unlock' `unsigned' `update' `usage'
`values' `varchar' `variables' `varying'
`varbinary' `with' `write' `when'
`where' `year' `year_month' `zerofill'
The following symbols (from the table above) are disallowed by ANSI SQL
but allowed by MySQL as column/table names. This is because some of
these names are very natural names and a lot of people have already
used them.
* `ACTION'
* `BIT'
* `DATE'
* `ENUM'
* `NO'
* `TEXT'
* `TIME'
* `TIMESTAMP'