| |
Этот раздел описывает различные способы записи строк и чисел в 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 как имена столбца/таблицы. Это потому, что некоторые из них представляют собой очень естественные и удобные имена, и много людей уже использовали их в работе:
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |