Обновлено: 29.03.2011 - 19:33
Этот раздел описывает различные способы записи строк и чисел в MySQL.
Это также покрывает различные нюансы, с которыми Вы можете сталкиваться,
когда имеете дело с этими базисными типами в MySQL.
Строка представляет собой последовательность символов, окруженных
одиночными кавычками (') или двойными кавычками
("). Допустима только одиночная кавычка, если Вы работаете в
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 на любой строке, которая могла
бы содержать любой из специальных символов, перечисленных выше!
Целые числа представляются как последовательность цифр. Числа с плавающей
точкой используют точку (.) как десятичный разделитель. Любому
типу числа может предшествовать знак -, чтобы указать
отрицательное значение числа.
Примеры имеющих силу целых чисел:
1221
0
-32
Примеры чисел с плавающей запятой:
294.42
-32032.6809e+10
148.00
Целое число может использоваться в контексте с плавающей запятой: это
интерпретируется как эквивалентное число с плавающей запятой.
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.
Значение NULL не означает "никакие данные" и отличается от
значений типа 0 для числовых типов или пустой строки для типов
строковых. Подробности в разделе "
11.5.3 Проблемы со значениями NULL".
NULL может представляться как \N при
использовании импортирования текстового файла или экспортных форматов
(LOAD DATA INFILE, SELECT ... INTO OUTFILE).
Подробности в разделе "8.4.9 Синтаксис
LOAD DATA INFILE".
Имена для баз данных, таблиц, индексов, столбцов и псевдонимов задаются по
общим правилам в 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-программы используют
имена таблиц с префиксом-точкой (.).
В 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.
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 предыдущей принятой строки.
Сервер 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
`--' как начало комментария".
Пробемы возникают при попытке создать таблицу с именами столбцов, которые
используют имена типов или функций, встроенных в MySQL, подобно
TIMESTAMP или GROUP. Вам позволяют делать это
(например, ABS позволенное имя столбца), но пробелы между именем
функции и ( при использовании функций, чьи имена также являются
именами столбцов, не допускаются.
Следующие слова явно зарезервированы в MySQL. Большинство их запрещается
ANSI SQL92 для имен таблицы или столбца (например, group).
Несколько слов зарезервированы потому, что MySQL нуждается в них и (в
настоящее время) использует синтаксический анализатор yacc:
| 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 |
Следующие символы (из таблицы выше) отвергнуты ANSI SQL, но позволены
MySQL как имена столбца/таблицы. Это потому, что некоторые из них
представляют собой очень естественные и удобные имена, и много людей уже
использовали их в работе:
- ACTION
- BIT
- DATE
- ENUM
- NO
- TEXT
- TIME
- TIMESTAMP
|