RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
YandexMoney: 
41001198119846 
E-gold:
5128052

3 Структура языка

3.1 Литералы: как писать строки и числа

Этот раздел описывает различные способы записи строк и чисел в MySQL. Это также покрывает различные нюансы, с которыми Вы можете сталкиваться, когда имеете дело с этими базисными типами в MySQL.

3.1.1 Строки

Строка представляет собой последовательность символов, окруженных одиночными кавычками (') или двойными кавычками ("). Допустима только одиночная кавычка, если Вы работаете в ANSI-режиме. Примеры:

'a string'
"another string"

Внутри строки некоторые последовательности имеют специальное значение. Каждая из этих последовательностей начинается с наклонной черты влево (\), известной как escape character. MySQL распознает следующие управляющие последовательности:

\0
Символ с кодом ASCII 0 (NUL).
\'
Символ одиночной кавычки (').
\"
Символ двойной кавычки (").
\b
Символ backspace.
\n
Символ newline.
\r
Символ возврата каретки.
\t
Символ табуляции.
\z
ASCII(26)=(Control-Z). Этот символ может быть закодирован, чтобы позволить Вам обойти проблему восприятия ASCII(26) как END-OF-FILE под Windows. ASCII(26) вызовет проблемы, если Вы попробуете использовать mysql database < filename.
\\
Символ backslash (\).
\%
Символ %. Это используется, чтобы искать литеральные образцы % в контекстах, где % иначе интерпретировался бы как групповой символ. Подробности в разделе "6.3.2.1 Функции сравнения строк".
\_
Символ _. Это используется, чтобы искать литеральные образцы _ в контекстах, где _ иначе интерпретировался бы как групповой символ. Подробности в разделе "6.3.2.1 Функции сравнения строк".

Обратите внимание, что, если Вы используете \% или \_ в некоторых контекстах, они возвратят строки \% и \_ вместо % и _.

Имеется несколько способов включить кавычки в строку:

  • ' внутри строки, цитируемой с ' может быть написано как ''.
  • `"' внутри строки, цитируемой с " может быть написано как "".
  • Вы можете предварить кавычку символом \.
  • ' внутри строки, цитируемой с " не требует специальной обработки или экранировки. Таким же образом, " внутри строки, цитируемой с ' этого тоже не требует.

Инструкции SELECT, приведенные ниже, показывают как работают цитирование и экранировка:

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
  +-------+---------+-----------+--------+--------+
  | hello | "hello" | ""hello"" | hel'lo | 'hello |
  +-------+---------+-----------+--------+--------+
mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
  +-------+---------+-----------+--------+--------+
  | hello | 'hello' | ''hello'' | hel"lo | "hello |
  +-------+---------+-----------+--------+--------+
mysql> SELECT "This\nIs\nFour\nlines";
  +--------------------+
  | This
  Is
  Four
  lines |
  +--------------------+

Если Вы хотите вставлять двоичные данные в столбец BLOB, следующие символы должны представляться в соответствии с управляющими последовательностями, экранирующими их:

NUL
ASCII 0. Вы должны представить это как \0.
\
ASCII 92, backslash. Представьте это как \\.
'
ASCII 39, одиночная кавычка. Представьте это как \'.
"
ASCII 34, двойная кавычка. Представьте это как \".

Если Вы пишете код на C, Вы можете использовать функцию C API mysql_escape_string() для инструкции INSERT. В языке Perl Вы можете использовать метод quote пакета DBI, чтобы преобразовать специальные символы в соответствующие управляющие последовательности.

Вы должны использовать функцию escape на любой строке, которая могла бы содержать любой из специальных символов, перечисленных выше!

3.1.2 Числа

Целые числа представляются как последовательность цифр. Числа с плавающей точкой используют точку (.) как десятичный разделитель. Любому типу числа может предшествовать знак -, чтобы указать отрицательное значение числа.

Примеры имеющих силу целых чисел:

1221
0
-32

Примеры чисел с плавающей запятой:

294.42
-32032.6809e+10
148.00

Целое число может использоваться в контексте с плавающей запятой: это интерпретируется как эквивалентное число с плавающей запятой.

3.1.3 Шестнадцатеричные значения

MySQL поддерживает шестнадцатеричные значения. В контексте числа это аналогично целому числу (64-разрядная точность). В контексте строки такое число эквивалентно двоичной строке, где каждая пара шестнадцатеричных цифр преобразована в соответствующий символ:

mysql> SELECT x'FF'
       -> 255
mysql> SELECT 0xa+0;
       -> 10
mysql> select 0x5061756c;
       -> Paul

Синтаксис x'hexstring' (нововведение в версии 4.0) основан на ANSI SQL и синтаксисе 0x из ODBC. Шестнадцатеричные строки часто используются ODBC, чтобы задать значения для столбцов типа BLOB.

3.1.4 Значения NULL

Значение NULL не означает "никакие данные" и отличается от значений типа 0 для числовых типов или пустой строки для типов строковых. Подробности в разделе " 11.5.3 Проблемы со значениями NULL".

NULL может представляться как \N при использовании импортирования текстового файла или экспортных форматов (LOAD DATA INFILE, SELECT ... INTO OUTFILE). Подробности в разделе "8.4.9 Синтаксис LOAD DATA INFILE".

3.2 Имена баз данных, таблиц, индексов, столбцов и псевдонимов

Имена для баз данных, таблиц, индексов, столбцов и псевдонимов задаются по общим правилам в MySQL.

Обратите внимание, что правила изменились, начиная с MySQL Version 3.23.6, когда авторы представили цитирование идентификаторов (имена баз данных, таблиц и столбцов) с помощью апострофа (`). Двойная кавычка (") также будет работать, чтобы цитировать идентификаторы, если Вы выполняетесь в ANSI-режиме. Подробности в разделе "1.4.3 Запуск MySQL в ANSI-режиме".

ИдентификаторМаксимальная длина Допустимые символы
База данных64Любые символы, допустимые в имени каталога, кроме / или ..
Таблица64Любые символы, допустимые в имени файла, кроме / или ..
Столбец64Все символы.
Псевдоним255Все символы.

Обратите внимание, что в дополнение к вышеупомянутому, Вы не можете иметь в идентификаторе символы цитирования, а также ASCII(0) или ASCII(255).

Обратите внимание, что, если идентификатор представляет собой ограниченное слово или содержит специальные символы, Вы должны всегда цитировать его с `:

SELECT * from `select` where `select`.id > 100;

В предыдущих версиях MySQL правила для имен были следующими:

  • Имя может состоять из алфавитно-цифровых символов текущего набора символов, а также из _ и $. Заданный по умолчанию набор символов: ISO-8859-1 Latin1, это может быть изменено опцией --default-character-set в mysqld.
  • Имя может начинаться с любого символа, который является допустимым в имени. В частности имя может начинаться с номера (это отличие от многих других систем управления базами данных!). Однако, имя не может состоять только из чисел.
  • Вы не можете использовать символ точки (.) в именах потому, что он используется, чтобы расширить формат, которым Вы можете обратиться к столбцам.

Рекомендуется, чтобы Вы не использовали имена, подобные 1e потому, что выражение вроде 1e+1 неоднозначно. Это может интерпретироваться как выражение 1e+1 или как число 1e+1.

В MySQL Вы можете обратиться к столбцу, используя любую из следующих форм:

Ссылка на столбецЗначение
col_nameСтолбец col_name из любой таблицы, используемой в запросе, содержащем это имя.
tbl_name.col_nameСтолбец col_name из таблицы tbl_name текущей базы данных.
db_name.tbl_name.col_nameСтолбец col_name из таблицы tbl_name базы данных db_name. Эта форма доступна в MySQL Version 3.22 или позже.
`column_name`Столбец, который является ключевым словом или содержит специальные символы.

Вы не должны определять префикс tbl_name или db_name.tbl_name для столбца в инструкции, если ссылка однозначна. Например, есть таблицы t1 и t2, каждая содержит столбец c, и Вы получаете c командой SELECT, которая использует t1 и t2. В этом случае c неоднозначен потому, что он не уникален среди таблиц, используемых в инструкции, так что Вы должны указать, что Вы имеете в виду: t1.c или t2.c. Точно так же, если Вы получаете данные из таблицы t в базе данных db1 и из таблицы t в базе данных db2, Вы должны обратиться к столбцам в тех таблицах как db1.t.col_name и db2.t.col_name.

Синтаксис .tbl_name означает таблицу tbl_name в текущей базе данных. Этот синтаксис принят для ODBC-совместимости потому, что некоторые ODBC-программы используют имена таблиц с префиксом-точкой (.).

3.3 Чувствительность к регистру в именах

В MySQL базы данных и таблицы соответствуют каталогам и файлам внутри тех каталогов. Следовательно, чувствительность операционной системы определяет чувствительность к регистру имен таблицы и базы данных. Это означает, что имена баз данных и таблиц чувствительны к регистру в Unix и нечувствительны в Windows. Подробности в разделе "1.4.1 MySQL-расширения для ANSI SQL92".

ОБРАТИТЕ ВНИМАНИЕ: Несмотря на отсутствие чувствительности к регистру имен баз данных и таблиц в Windows, СУБД все же такое различие делает. Так что в рамках одного запроса надо использовать одно и то же имя. Например, этот запрос не сработает из-за одновременного применения my_table и MY_TABLE:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

Имена столбца нечувствительны к регистру символов во всех случаях.

Псевдонимы для таблиц чувствительны к регистру. Например, этот запрос не сработает из-за одновременного применения a и A:

mysql> SELECT col_name FROM tbl_name AS a
           WHERE a.col_name = 1 OR A.col_name = 2;

Псевдонимы для столбцов нечувствительны к регистру.

Если Вы имеете проблему при запоминании используемых имен таблиц, примите непротиворечивое соглашение, типа всегда создавать базы данных и таблицы, использующих имена нижнего регистра.

Один способ избежать этой проблемы состоит в том, чтобы запустить mysqld с опцией -O lower_case_table_names=1. По умолчанию эта опция установлена в 1 под Windows и в 0 под Unix.

Если lower_case_table_names равен 1, MySQL преобразует все имена таблицы в строчные буквы. Обратите внимание, что, если Вы изменяете эту опцию, Вы должны сначала преобразовать Ваши старые имена таблиц в строчные буквы перед запуском сервера mysqld.

3.4 Пользовательские переменные

MySQL поддерживает поточно-зависимые переменные с синтаксисом @variablename. Имя переменной может состоять из алфавитно-цифровых символов из текущего набора символов, а также из _, $ и ..

Переменные не должны быть инициализированы. Они содержат NULL по умолчанию и могут сохранять целое число, реальное или строковое значение. Все переменные для потока будут освобождены, когда поток завершится.

Вы можете устанавливать переменную через вызов SET:

SET @variable = {integer expression|real expression|string expression}
                [,@variable= ...].

Вы можете также устанавливать переменную в выражении @variable:=expr:

select @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
  +----------------------+------+------+------+
  | @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
  +----------------------+------+------+------+
  |                    5 |    5 |    1 |    4 |
  +----------------------+------+------+------+

Здесь надо использовать синтаксис := потому, что = был зарезервирован для сравнений.

Переменные пользователя могут применяться там, где позволяются выражения. Обратите внимание, что это в настоящее время не включает использование в контекстах, где явно требуется число, например, в предложении LIMIT вызова SELECT, или в предложении IGNORE number LINES в инструкции LOAD DATA.

ОБРАТИТЕ ВНИМАНИЕ: В инструкции SELECT каждое выражение вычислено только тогда, когда оно послано пользователю. Это означает, что в HAVING, GROUP BY или ORDER BY Вы не можете обратиться к выражению, которое включает переменные, которые установлены в SELECT. Например, следующая инструкция НЕ будет работать как ожидается:

SELECT (@aa:=id) AS a, (@aa+3) AS b FROM table_name HAVING b=5;

Причина: @aa будет содержать не значение текущей строки, а значение id предыдущей принятой строки.

3.5 Комментарии

Сервер MySQL поддерживает стили комментариев # до конца строки, -- до конца строки и /* в строке или в нескольких строках */:

mysql> select 1+1;     # Этот комментарий продолжается до конца строки.
mysql> select 1+1;     -- Этот тоже.
mysql> select 1 /* это комментарий, встроенный в строку */ + 1;
mysql> select 1+
/*
Это комментарий,
занимающий несколько строк.
*/
1;

Обратите внимание, что стиль комментария -- требует, чтобы Вы имели по крайней мере один пробел после --!

Хотя сервер понимает синтаксис комментария, имеются некоторые ограничения на путь, которым клиент mysql анализирует комментарии /* ... */:

  • Символы в одиночных и двойных кавычках указывают начало цитируемой строки даже внутри комментария. Если кавычка не согласована с второй кавычкой внутри комментария, синтаксический анализатор не понимает, что комментарий уже закончился. Если Вы работаете с mysql в интерактивном режиме, Вы можете крепко запутаться с приглашением командной строки, которое меняется с mysql> на '> или на ">.
  • Точка с запятой указывает конец текущей инструкции SQL.

Эти ограничения применяются, когда Вы выполняете mysql в интерактивном режиме и тогда, когда Вы помещаете команды в файл и сообщаете, чтобы mysql читал ввод из этого файла командой mysql < some-file.

MySQL не поддерживает ANSI SQL стиль комментария `--'. Подробности в разделе "1.4.4.8 `--' как начало комментария".

3.6 Как MySQL работает с зарезервированными словами

Пробемы возникают при попытке создать таблицу с именами столбцов, которые используют имена типов или функций, встроенных в MySQL, подобно TIMESTAMP или GROUP. Вам позволяют делать это (например, ABS позволенное имя столбца), но пробелы между именем функции и ( при использовании функций, чьи имена также являются именами столбцов, не допускаются.

Следующие слова явно зарезервированы в MySQL. Большинство их запрещается ANSI SQL92 для имен таблицы или столбца (например, group). Несколько слов зарезервированы потому, что MySQL нуждается в них и (в настоящее время) использует синтаксический анализатор yacc:
actionadd aggregateall
alterafter andas
ascavg avg_row_lengthauto_increment
betweenbigint bitbinary
blobboolboth by
cascadecase charcharacter
changecheck checksumcolumn
columnscomment constraintcreate
crosscurrent_date current_timecurrent_timestamp
datadatabase databasesdate
datetimeday day_hourday_minute
day_seconddayofmonth dayofweekdayofyear
decdecimal defaultdelayed
delay_key_writedelete descdescribe
distinctdistinctrow doubledrop
endelseescape escaped
enclosedenum explainexists
fieldsfile firstfloat
float4float8 flushforeign
fromforfull function
globalgrant grantsgroup
havingheap high_priorityhour
hour_minute hour_second hostsidentified
ignoreinindex infile
innerinsert insert_idint
integerinterval int1int2
int3int4int8 into
ifisisam join
keykeyskill last_insert_id
leadingleftlength like
lineslimitload local
locklogslong longblob
longtextlow_priority maxmax_rows
matchmediumblob mediumtextmediumint
middleintmin_rows minuteminute_second
modifymonth monthnamemyisam
naturalnumericno not
nullonoptimize option
optionallyororder outer
outfilepack_keys partialpassword
precisionprimary procedureprocess
processlistprivileges readreal
referencesreload regexprename
replacerestrict returnsrevoke
rlikerowrows second
selectsetshow shutdown
smallintsoname sql_big_tablessql_big_selects
sql_low_priority_updatessql_log_off sql_log_updatesql_select_limit
sql_small_resultsql_big_result sql_warningsstraight_join
startingstatus stringtable
tablestemporary terminatedtext
thentimetimestamp tinyblob
tinytexttinyint trailingto
typeuseusing unique
unlockunsigned updateusage
valuesvarchar variablesvarying
varbinarywithwrite when
whereyearyear_month zerofill

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

  • ACTION
  • BIT
  • DATE
  • ENUM
  • NO
  • TEXT
  • TIME
  • TIMESTAMP

Поиск

 

Найди своих коллег!