Search the MySQL manual:
Subscribe to the monthly
MySQL Newsletter!

6.1.7 ``Придирчив'' ли MySQL к зарезервированным словам?

Это общая проблема, возникающая при попытке создать таблицу с именами столбцов, использующих принятые в MySQL названия типов данных или функций, такие как TIMESTAMP или GROUP. Иногда это возможно (например, ABS является разрешенным именем для столбца), но не допускается пробел между именем функции и сразу же следующей за ним скобкой `(' при использовании имен функций, совпадающих с именами столбцов.

Следующие слова являются зарезервированными в MySQL. Большинство из них не допускаются в ANSI SQL92 как имена столбцов и/или таблиц (например GROUP). Некоторые зарезервированы для нужд MySQL и используются (в настоящее время) синтаксическим анализатором yacc:

Word Word Word
ADD ALL ALTER
ANALYZE AND AS
ASC ASENSITIVE AUTO_INCREMENT
BDB BEFORE BERKELEYDB
BETWEEN BIGINT BINARY
BLOB BOTH BY
CALL CASCADE CASE
CHANGE CHAR CHARACTER
CHECK COLLATE COLUMN
COLUMNS CONDITION CONNECTION
CONSTRAINT CONTINUE CREATE
CROSS CURRENT_DATE CURRENT_TIME
CURRENT_TIMESTAMP CURSOR DATABASE
DATABASES DAY_HOUR DAY_MICROSECOND
DAY_MINUTE DAY_SECOND DEC
DECIMAL DECLARE DEFAULT
DELAYED DELETE DESC
DESCRIBE DETERMINISTIC DISTINCT
DISTINCTROW DIV DOUBLE
DROP ELSE ELSEIF
ENCLOSED ESCAPED EXISTS
EXIT EXPLAIN FALSE
FETCH FIELDS FLOAT
FOR FORCE FOREIGN
FOUND FRAC_SECOND FROM
FULLTEXT GRANT GROUP
HAVING HIGH_PRIORITY HOUR_MICROSECOND
HOUR_MINUTE HOUR_SECOND IF
IGNORE IN INDEX
INFILE INNER INNODB
INOUT INSENSITIVE INSERT
INT INTEGER INTERVAL
INTO IO_THREAD IS
ITERATE JOIN KEY
KEYS KILL LEADING
LEAVE LEFT LIKE
LIMIT LINES LOAD
LOCALTIME LOCALTIMESTAMP LOCK
LONG LONGBLOB LONGTEXT
LOOP LOW_PRIORITY MASTER_SERVER_ID
MATCH MEDIUMBLOB MEDIUMINT
MEDIUMTEXT MIDDLEINT MINUTE_MICROSECOND
MINUTE_SECOND MOD NATURAL
NOT NO_WRITE_TO_BINLOG NULL
NUMERIC ON OPTIMIZE
OPTION OPTIONALLY OR
ORDER OUT OUTER
OUTFILE PRECISION PRIMARY
PRIVILEGES PROCEDURE PURGE
READ REAL REFERENCES
REGEXP RENAME REPEAT
REPLACE REQUIRE RESTRICT
RETURN REVOKE RIGHT
RLIKE SECOND_MICROSECOND SELECT
SENSITIVE SEPARATOR SET
SHOW SMALLINT SOME
SONAME SPATIAL SPECIFIC
SQL SQLEXCEPTION SQLSTATE
SQLWARNING SQL_BIG_RESULT SQL_CALC_FOUND_ROWS
SQL_SMALL_RESULT SQL_TSI_DAY SQL_TSI_FRAC_SECOND
SQL_TSI_HOUR SQL_TSI_MINUTE SQL_TSI_MONTH
SQL_TSI_QUARTER SQL_TSI_SECOND SQL_TSI_WEEK
SQL_TSI_YEAR SSL STARTING
STRAIGHT_JOIN STRIPED TABLE
TABLES TERMINATED THEN
TIMESTAMPADD TIMESTAMPDIFF TINYBLOB
TINYINT TINYTEXT TO
TRAILING TRUE UNDO
UNION UNIQUE UNLOCK
UNSIGNED UPDATE USAGE
USE USER_RESOURCES USING
UTC_DATE UTC_TIME UTC_TIMESTAMP
VALUES VARBINARY VARCHAR
VARCHARACTER VARYING WHEN
WHERE WHILE WITH
WRITE XOR YEAR_MONTH
ZEROFILL

Следующие символы (из приведенной выше таблицы таблицы) не разрешены в ANSI SQL, но допускаются в MySQL как имена столбцов/таблиц. Это объясняется тем, что некоторые из этих имен являются словами естественного языка и уже использованы многими потребителями.

User Comments

Posted by Martin Francis on February 10 2003 7:54am[Delete] [Edit]

The way around this is to place backticks (`name`) around the table name and relevant column names, for example:

CREATE TABLE `group` (
ID CHAR(13) NOT NULL,
createdByID CHAR(13) NOT NULL,
`read` CHAR(1) NULL,
PRIMARY KEY (ID)
)

As a rule, I use backticks on all table names and all column references anyway to avoid any suprises.

Posted by [name withheld] on February 12 2003 3:25pm[Delete] [Edit]

The better way around it is to stick with the ANSI standard double-quotes, not backticks.

Also, if you have a double-quote in the variable name, you just use two double-quotes, e.g. Annoying "variable name" becomes "Annoying ""variable name""".

Posted by Brian Fearon on April 4 2003 5:09am[Delete] [Edit]

Backticks are the MySQL style of quoting table and column names. Only if you are running in ANSI mode should you use double-quotes.

Posted by [name withheld] on July 14 2003 10:47am[Delete] [Edit]

The underscore ("_") is a 'reserved character' since there is support for using it as a wildcard charcter for database names. Here is an example:

mysql> SHOW DATABASES LIKE 'm_sql'\G
*************************** 1. row ***************************
Database (m_sql): mysql
1 row in set (0.00 sec)

Wildcard characters are discussed here:
http://www.mysql.com/doc/en/String_comparison_functions.html

Posted by [name withheld] on August 26 2003 4:36am[Delete] [Edit]

Could it be that 'events' is also a reserved word ? (More specifically in MySQL 4 - alpha

When used as a tablename like
SELECT var FROM events
, it generates an error. When surrounded with backticks like
SELECT var FROM `events`
it goes through fine?

Posted by Till Klampaeckel on December 12 2003 7:46am[Delete] [Edit]

The best way of course, to keep your code as close to the standard as possible, is to avoid reserved words and not use the backtick operator. :-)

Add your own comment.