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