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