Этот раздел описывает различные способы записи строк и чисел в MySQL. Это также покрывает различные нюансы, с которыми Вы можете сталкиваться, когда имеете дело с этими базисными типами в MySQL.
Строка представляет собой последовательность символов, окруженных одиночными кавычками (') или двойными кавычками ("). Допустима только одиночная кавычка, если Вы работаете в ANSI-режиме. Примеры:
'a string' "another string"
Внутри строки некоторые последовательности имеют специальное значение. Каждая из этих последовательностей начинается с наклонной черты влево (\), известной как escape character. MySQL распознает следующие управляющие последовательности:
\0
NUL).
\'
\"
\b
\n
\r
\t
\z
mysql database < filename.
\\
\%
\_
Обратите внимание, что, если Вы используете \% или \_ в некоторых контекстах, они возвратят строки \% и \_ вместо % и _.
Имеется несколько способов включить кавычки в строку:
Инструкции 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
\
'
"
Если Вы пишете код на 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Значение 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 правила для имен были следующими:
--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> на '> или на
">.
Эти ограничения применяются, когда Вы выполняете 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 как имена столбца/таблицы. Это потому, что некоторые из них представляют собой очень естественные и удобные имена, и много людей уже использовали их в работе:
ACTIONBITDATEENUMNOTEXTTIMETIMESTAMP