Buy this Reference Manual in softcover from Barnes & Noble!
Это общая проблема, возникающая при попытке создать таблицу с именами столбцов, использующих принятые в MySQL названия типов данных или функций, такие как TIMESTAMP
или GROUP
. Иногда это возможно (например, ABS
является разрешенным именем для столбца), но не допускается пробел между именем функции и сразу же следующей за ним скобкой `(' при использовании имен функций, совпадающих с именами столбцов.
Следующие слова являются зарезервированными в MySQL. Большинство из них не допускаются в ANSI SQL92 как имена столбцов и/или таблиц (например GROUP). Некоторые зарезервированы для нужд MySQL и используются (в настоящее время) синтаксическим анализатором yacc
:
Слово | Слово | Слово |
ADD |
ALL |
ALTER |
ANALYZE |
AND |
AS |
ASC |
AUTO_INCREMENT |
BDB |
BERKELEYDB |
BETWEEN |
BIGINT |
BINARY |
BLOB |
BOTH |
BY |
CASCADE |
CASE |
CHANGE |
CHAR |
CHARACTER |
COLUMN |
COLUMNS |
CONSTRAINT |
CREATE |
CROSS |
CURRENT_DATE |
CURRENT_TIME |
CURRENT_TIMESTAMP |
DATABASE |
DATABASES |
DAY_HOUR |
DAY_MINUTE |
DAY_SECOND |
DEC |
DECIMAL |
DEFAULT |
DELAYED |
DELETE |
DESC |
DESCRIBE |
DISTINCT |
DISTINCTROW |
DOUBLE |
DROP |
ELSE |
ENCLOSED |
ESCAPED |
EXISTS |
EXPLAIN |
FIELDS |
FLOAT |
FOR |
FOREIGN |
FROM |
FULLTEXT |
FUNCTION |
GRANT |
GROUP |
HAVING |
HIGH_PRIORITY |
HOUR_MINUTE |
HOUR_SECOND |
IF |
IGNORE |
IN |
INDEX |
INFILE |
INNER |
INNODB |
INSERT |
INSERT_ID |
INT |
INTEGER |
INTERVAL |
INTO |
IS |
JOIN |
KEY |
KEYS |
KILL |
LAST_INSERT_ID |
LEADING |
LEFT |
LIKE |
LIMIT |
LINES |
LOAD |
LOCK |
LONG |
LONGBLOB |
LONGTEXT |
LOW_PRIORITY |
MASTER_SERVER_ID |
MATCH |
MEDIUMBLOB |
MEDIUMINT |
MEDIUMTEXT |
MIDDLEINT |
MINUTE_SECOND |
MRG_MYISAM |
NATURAL |
NOT |
NULL |
NUMERIC |
ON |
OPTIMIZE |
OPTION |
OPTIONALLY |
OR |
ORDER |
OUTER |
OUTFILE |
PARTIAL |
PRECISION |
PRIMARY |
PRIVILEGES |
PROCEDURE |
PURGE |
READ |
REAL |
REFERENCES |
REGEXP |
RENAME |
REPLACE |
REQUIRE |
RESTRICT |
RETURNS |
REVOKE |
RIGHT |
RLIKE |
SELECT |
SET |
SHOW |
SMALLINT |
SONAME |
SQL_AUTO_IS_NULL |
SQL_BIG_RESULT |
SQL_BIG_SELECTS |
SQL_BIG_TABLES |
SQL_BUFFER_RESULT |
SQL_CALC_FOUND_ROWS |
SQL_LOG_BIN |
SQL_LOG_OFF |
SQL_LOG_UPDATE |
SQL_LOW_PRIORITY_UPDATES |
SQL_MAX_JOIN_SIZE |
SQL_QUOTE_SHOW_CREATE |
SQL_SAFE_UPDATES |
SQL_SELECT_LIMIT |
SQL_SLAVE_SKIP_COUNTER |
SQL_SMALL_RESULT |
SQL_WARNINGS |
SSL |
STARTING |
STRAIGHT_JOIN |
STRIPED |
TABLE |
TABLES |
TERMINATED |
THEN |
TINYBLOB |
TINYINT |
TINYTEXT |
TO |
TRAILING |
UNION |
UNIQUE |
UNLOCK |
UNSIGNED |
UPDATE |
USAGE |
USE |
USER_RESOURCES |
USING |
VALUES |
VARBINARY |
VARCHAR |
VARYING |
WHEN |
WHERE |
WITH |
WRITE |
YEAR_MONTH |
ZEROFILL |
Следующие символы (из приведенной выше таблицы таблицы) не разрешены в ANSI SQL, но допускаются в MySQL как имена столбцов/таблиц. Это объясняется тем, что некоторые из этих имен являются словами естественного языка и уже использованы многими потребителями.
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP
Posted by on Monday 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 on Wednesday 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""".
Add your own comment.