WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Этот раздел описывает различные способы записи строк и чисел в MySQL.
Это также покрывает различные нюансы, с которыми Вы можете сталкиваться,
когда имеете дело с этими базисными типами в MySQL. Строка представляет собой последовательность символов, окруженных
одиночными кавычками (') или двойными кавычками
("). Допустима только одиночная кавычка, если Вы работаете в
ANSI-режиме. Примеры: Внутри строки некоторые последовательности имеют специальное значение.
Каждая из этих последовательностей начинается с наклонной черты влево
(\), известной как escape character. MySQL распознает
следующие управляющие последовательности: Обратите внимание, что, если Вы используете \% или
\_ в некоторых контекстах, они возвратят строки \%
и \_ вместо % и _. Имеется несколько способов включить кавычки в строку:
Инструкции Если Вы хотите вставлять двоичные данные в столбец
Если Вы пишете код на C, Вы можете использовать функцию
C API Вы должны использовать функцию escape на любой строке, которая могла
бы содержать любой из специальных символов, перечисленных выше! Целые числа представляются как последовательность цифр. Числа с плавающей
точкой используют точку (.) как десятичный разделитель. Любому
типу числа может предшествовать знак -, чтобы указать
отрицательное значение числа. Примеры имеющих силу целых чисел: Примеры чисел с плавающей запятой: Целое число может использоваться в контексте с плавающей запятой: это
интерпретируется как эквивалентное число с плавающей запятой. MySQL поддерживает шестнадцатеричные значения. В контексте числа это
аналогично целому числу (64-разрядная точность). В контексте строки такое
число эквивалентно двоичной строке, где каждая пара шестнадцатеричных цифр
преобразована в соответствующий символ: Синтаксис x'hexstring' (нововведение в версии 4.0) основан на ANSI SQL и
синтаксисе 0x из ODBC. Шестнадцатеричные строки часто используются ODBC,
чтобы задать значения для столбцов типа BLOB. Значение Имена для баз данных, таблиц, индексов, столбцов и псевдонимов задаются по
общим правилам в MySQL. Обратите внимание, что правила изменились, начиная с MySQL Version 3.23.6,
когда авторы представили цитирование идентификаторов (имена баз данных,
таблиц и столбцов) с помощью апострофа (`). Двойная кавычка
(") также будет работать, чтобы цитировать идентификаторы, если
Вы выполняетесь в ANSI-режиме. Подробности в разделе
"1.4.3 Запуск MySQL в ANSI-режиме". Обратите внимание, что в дополнение к вышеупомянутому, Вы не можете иметь
в идентификаторе символы цитирования, а также ASCII(0) или ASCII(255). Обратите внимание, что, если идентификатор представляет собой ограниченное
слово или содержит специальные символы, Вы должны всегда цитировать его с
В предыдущих версиях MySQL правила для имен были следующими: Рекомендуется, чтобы Вы не использовали имена, подобные В MySQL Вы можете обратиться к столбцу, используя любую из следующих форм:
Вы не должны определять префикс Синтаксис В MySQL базы данных и таблицы соответствуют каталогам и файлам внутри тех
каталогов. Следовательно, чувствительность операционной системы определяет
чувствительность к регистру имен таблицы и базы данных. Это означает, что
имена баз данных и таблиц чувствительны к регистру в Unix и нечувствительны в
Windows. Подробности в разделе "1.4.1
MySQL-расширения для ANSI SQL92". ОБРАТИТЕ ВНИМАНИЕ: Несмотря на отсутствие чувствительности
к регистру имен баз данных и таблиц в Windows, СУБД все же такое различие
делает. Так что в рамках одного запроса надо использовать одно и то же имя.
Например, этот запрос не сработает из-за одновременного применения
Имена столбца нечувствительны к регистру символов во всех случаях. Псевдонимы для таблиц чувствительны к регистру. Например, этот запрос не
сработает из-за одновременного применения Псевдонимы для столбцов нечувствительны к регистру. Если Вы имеете проблему при запоминании используемых имен таблиц, примите
непротиворечивое соглашение, типа всегда создавать базы данных и таблицы,
использующих имена нижнего регистра. Один способ избежать этой проблемы состоит в том, чтобы запустить
Если MySQL поддерживает поточно-зависимые переменные с синтаксисом
Переменные не должны быть инициализированы. Они содержат Вы можете устанавливать переменную через вызов Вы можете также устанавливать переменную в выражении
Здесь надо использовать синтаксис Переменные пользователя могут применяться там, где позволяются выражения.
Обратите внимание, что это в настоящее время не включает использование в
контекстах, где явно требуется число, например, в предложении
ОБРАТИТЕ ВНИМАНИЕ: В инструкции Причина: Сервер MySQL поддерживает стили комментариев Обратите внимание, что стиль комментария Хотя сервер понимает синтаксис комментария, имеются некоторые ограничения
на путь, которым клиент Эти ограничения применяются, когда Вы выполняете MySQL не поддерживает ANSI SQL стиль комментария `--'.
Подробности в разделе "1.4.4.8
`--' как начало комментария". Пробемы возникают при попытке создать таблицу с именами столбцов, которые
используют имена типов или функций, встроенных в MySQL, подобно
Следующие слова явно зарезервированы в MySQL. Большинство их запрещается
ANSI SQL92 для имен таблицы или столбца (например, Следующие символы (из таблицы выше) отвергнуты ANSI SQL, но позволены
MySQL как имена столбца/таблицы. Это потому, что некоторые из них
представляют собой очень естественные и удобные имена, и много людей уже
использовали их в работе:
3 Структура языка
3.1 Литералы: как писать строки и числа
3.1.1 Строки
'a string'
"another string"
\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
\
'
"
mysql_escape_string()
для инструкции INSERT
.
В языке Perl Вы можете использовать метод quote
пакета
DBI
, чтобы преобразовать специальные символы в соответствующие
управляющие последовательности.3.1.2 Числа
1221
0
-32
294.42
-32032.6809e+10
148.00
3.1.3 Шестнадцатеричные значения
mysql> SELECT x'FF'
-> 255
mysql> SELECT 0xa+0;
-> 10
mysql> select 0x5061756c;
-> Paul
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 Имена баз данных, таблиц,
индексов, столбцов и псевдонимов
Идентификатор Максимальная длина
Допустимые символы База данных 64 Любые символы, допустимые в имени
каталога, кроме / или .. Таблица 64 Любые символы, допустимые в имени файла,
кроме / или .. Столбец 64 Все символы. Псевдоним 255 Все символы. `
:
SELECT * from `select` where `select`.id > 100;
--default-character-set
в mysqld
.
1e
потому, что выражение вроде 1e+1
неоднозначно. Это может
интерпретироваться как выражение 1e+1
или как число
1e+1
.
Ссылка на столбец Значение
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 Чувствительность к регистру в именах
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 Пользовательские переменные
@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> select 1+1; # Этот комментарий продолжается до конца строки.
mysql> select 1+1; -- Этот тоже.
mysql> select 1 /* это комментарий, встроенный в строку */ + 1;
mysql> select 1+
/*
Это комментарий,
занимающий несколько строк.
*/
1;
--
требует, чтобы Вы
имели по крайней мере один пробел после --
!mysql
анализирует комментарии
/* ... */
:mysql
в интерактивном
режиме, Вы можете крепко запутаться с приглашением командной строки, которое
меняется с mysql>
на '>
или на
">
.
mysql
в
интерактивном режиме и тогда, когда Вы помещаете команды в файл и сообщаете,
чтобы mysql
читал ввод из этого файла командой
mysql < some-file
.3.6
Как MySQL работает с зарезервированными словами
TIMESTAMP
или GROUP
. Вам позволяют делать это
(например, ABS
позволенное имя столбца), но пробелы между именем
функции и ( при использовании функций, чьи имена также являются
именами столбцов, не допускаются.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
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP
Найди своих коллег! |