Почему в названии mysql присутствуют буквы sql
Перейти к содержимому

Почему в названии mysql присутствуют буквы sql

  • автор:

Использование критерия Like для поиска данных

Условия или оператор Like используются в запросе для поиска данных, которые соответствуют определенному шаблону. Например, в нашей базе данных есть таблица «Клиенты», как по примеру ниже, и нам нужно найти только клиентов, живущих в городах, названия которых начинаются с «B». Вот как мы создадим запрос и будем использовать условия Like:

Таблица клиентов

«Клиенты»:

  • На вкладке Создание нажмите кнопку Конструктор запросов.
  • Нажмите кнопку «Добавить», и таблица «Клиенты» будет добавлена в конструктор запросов.
  • Дважды щелкните поля «Фамилия»и «Город», чтобы добавить их в сетку конструктора запросов.
  • В поле «Город» добавьте условия «Нравится B*» и нажмите кнопку «Выполнить».

    Критерий запроса Like

    В результатах запроса будут отбираться только клиенты из названий городов, названия которых начинаются с буквы «B».

    Результаты запроса Like

    Дополнительные информацию об использовании критериев см. в этой теме.

    Использование оператора Like в SQL в синтаксис

    Если вы предпочитаете синтаксис SQL (язык SQL), вот как это сделать:

    1. Откройте таблицу «Клиенты» и на вкладке «Создание» нажмите кнопку «Конструктор запросов».
    2. На вкладке «Главная» нажмите кнопку «>SQL», а затем введите следующий синтаксис:

    SELECT [Last Name], City FROM Customers WHERE City Like “B*”;

    1. Щелкните Выполнить.
    2. Щелкните вкладку запроса правой кнопкой мыши и выберите >«Закрыть».

    Дополнительные сведения см. в SQL Access: основные понятия, лексика и синтаксис, а также о том, как изменять SQL для более четкого получения результатов запроса.

    Примеры шаблонов условий Like и результатов

    Условия или оператор Like удобны при сравнении значения поля с строкным выражением. Следующий пример возвращает данные, которые начинаются с буквы P, за которой идут любая буква от A до F и три цифры:

    Like “P[A-F]###”

    Вот несколько способов использования like для различных шаблонов:

    Если ваша база данных имеет
    соответствие, вы увидите

    Если в базе данных нет
    совпадений, вы увидите

    Основы работы с MySQL

    MySQL — одна из наиболее используемых систем управления базами данных: Что такое СУБД? MySQL применяется для хранения данных в Youtube, Twitter, Wikipedia. А также базы данных используются популярными CMS. В Рег.ру база данных входит в услугу хостинга.

    Подробнее о MySQL мы рассказали в статье.

    Как это следует из названия, в данной библиотеке используется формальный язык SQL (Structured Query Language), на котором создаются запросы к базам данных. Основной инструмент для работы с базами данных MySQL — phpMyAdmin. Подробнее о работе в phpMyAdmin читайте в статье.

    Достоинства MySQL:

    • полностью бесплатная СУБД;
    • поддерживается большинством CMS;
    • неограниченный многопользовательский режим;
    • множество плагинов, облегчающих работу с данной СУБД;
    • поддерживает различные типы таблиц (MyISAM, InnoDB, HEAP, MERGE);
    • позволяет добавлять до 50 миллионов строк в таблицы.

    Недостатки MySQL:

    • ограниченный функционал (не реализованы все возможности SQL);
    • не подходит для масштабных проектов.

    Базы данных на хостинге Рег.ру доступны на всех тарифах, кроме Host-Lite и Win-Lite. Также базы данных доступны во всех панелях управления веб-хостингом. Если у вас один из этих тарифов, для использования баз данных повысьте тариф.

    Как узнать имя сервера, имя пользователя и пароль для подключения к базе данных MySQL?

    Для подключения к базе данных MySQL и для входа в phpMyAdmin необходимо указывать логин и пароль пользователя базы данных.

    Логин и пароль

    После заказа услуги хостинга в панели управления уже присутствует база данных «u1234567_default» (u1234567 — ваш логин хостинга). Вы можете воспользоваться этой базой данных. Реквизиты доступа к ней приведены в информационном письме и в личном кабинете в карточке услуги.

    Как узнать логин и пароль услуги хостинга?

    Логин и пароль услуги хостинга указаны в информационном письме, отправленном на контактный email после заказа хостинга. Также данная информация продублирована в личном кабинете. Авторизуйтесь на сайте Рег.ру и кликните по нужной услуге хостинга. Логин и пароль указаны на вкладке «Доступы»:

    Или вы можете создать новую базу данных. В этом случае имя базы, имя пользователя и пароль вы зададите самостоятельно. Если у вас уже есть созданный сайт на CMS, узнать пароль базы данных можно в конфигурационном файле сайта: Где CMS хранит настройки подключения к базе данных.

    Имя сервера

    В качестве сервера базы данных необходимо указывать «localhost».

    Как изменить пароль базы данных

    Важно: в ispmanager подраздел «Базы данных» недоступен, если вы используете тариф «Host-Lite».

    Чтобы изменить пароль базы данных, войдите в вашу панель управления хостингом и следуйте соответствующей инструкции ниже:

    Ispmanager

    Список баз данных в ispmanager 6

    Перейдите в раздел «Базы данных», выберите нужную базу и нажмите Пользователи:

    Список баз данных в ispmanager 8

    Выберите пользователя БД, пароль которого необходимо изменить, и нажмите Изменить:

    В открывшемся окне введите новый пароль и нажмите Ok.

    Обратите внимание: если вид вашей панели управления отличается от представленного в статье, в разделе «Основная информация» переключите тему с paper_lantern на jupiter.

    Что такое MySQL 1

    В блоке «Базы данных» выберите пункт Базы данных MySQL:

    Что такое MySQL 2

    Пролистайте страницу вниз до раздела «Текущие пользователи» и кликните по ссылке Изменить пароль для нужного пользователя:

    =749x389

    Дважды введите новый пароль (если нужно, используйте генератор паролей). Нажмите кнопку Изменить пароль.

    Управление пользователями 1

    Перейдите в раздел «базы данных» и на открывшейся странице нажмите управление пользователями:

    Кликните по имени пользователя, пароль которого необходимо изменить.

    Управление пользователями 2

    На открывшейся странице сгенерируйте новый пароль, нажав кнопку создать. чтобы увидеть и скопировать новый пароль, нажмите показать. нажмите применить для сохранения изменений:

    Готово, пароль базы данных изменён.

    Измените пароль в конфигурационном файле сайта

    Не забудьте изменить пароль базы данных в настройках сайта: Где cms хранит настройки подключения к базе данных.

    Как создать базу данных

    Создание базы данных происходит в панели управления хостингом. Войдите в вашу панель управления хостингом и следуйте соответствующей инструкции ниже:

    Ispmanager

    Создать новую базу данных в ispmanager 6

    Перейдите в раздел базы данных и нажмите создать базу данных:

    Укажите имя базы данных и выберите из выпадающего списка имя пользователя. также вы можете создать нового пользователя, при этом в названии автоматически добавится префикс из вашего логина хостинга.

    Сгенерируйте пароль пользователя и нажмите ок.

    Готово, новая база данных создана.

    Ошибка при создании бд в ispmanager

    При создании базы данных к названию базы и к имени пользователя автоматически добавляется префикс вида u1234567_ (итого 9 символов), максимальное количество символов в имени — 16. таким образом, вводимое вами имя базы и имя пользователя не должно превышать 7 символов (16 минус префикс).

    Обратите внимание: если вид вашей панели управления отличается от представленного в статье, в разделе «основная информация» переключите тему с paper_lantern на jupiter.

    Мастер баз данных MySQL 1

    В разделе «базы данных» выберите пункт мастер баз данных mysql:

    Мастер баз данных MySQL 2

    На открывшейся странице укажите название базы данных и нажмите следующий шаг. к названию базы данных автоматически добавляется префикс вида u1234567_.

    =850x481

    Укажите имя пользователя базы данных, пароль и повторите пароль. затем нажмите создать пользователя: К имени пользователя автоматически добавляется префикс вида u1234567_ (где u1234567 — ваш логин услуги хостинга).

    Укажите права пользователя по отношению к базе данных (обычно необходимы все права) и нажмите Следующий шаг: img src=«https://img.reg.ru/faq/20220809_osnovy_raboty_s_mysql_7.png» loading=«lazy» alt=«=810×524 „Мастер баз данных MySQL 4“ itemprop=„contentUrl“ />

    Готово, новая база данных создана.

    Добавить базу данных 1

    Перейдите в раздел «Базы данных» и нажмите кнопку Добавить базу данных:

    • имя базы данных (к названию автоматически добавляется префикс вида u1234567_);
    • выберите сайт, на котором будет использоваться база данных;
    • имя нового пользователя базы данных (к имени автоматически добавляется префикс вида u1234_);
    • пароль и подтверждение пароля.

    Обратите внимание! Каждая база данных должна иметь хотя бы одного пользователя, иначе она будет недоступна. Поставив галочку в соответствующей графе, вы разрешите пользователю доступ ко всем базам данных выбранной подписки.

    Нажмите ОК внизу страницы.

    Готово, новая база данных создана.

    Внимание!

    На серверах компании Рег.ру присутствует проверка на сложность пароля. Пароль не может быть короче 6 символов и должен содержать специальные символы (например: !,@,#,$,%,&. _), буквы латинского алфавита: a-z, цифры: 0-9. Если вводимый вами пароль пользователя базы данных не удовлетворяет этим требованиям, появится соответствующее предупреждение.

    Удалённый доступ к базе данных MySQL

    Для активации удалённого соединения с базой данных войдите в вашу панель управления хостингом, и следуйте соответствующей инструкции ниже:

    Ispmanager

    Базы данных в ispmanager 1

    Чтобы активировать удаленный доступ MySQL, выберите пункт «Базы данных». Кликните по базе данных и нажмите Пользователи:

    Базы данных в ispmanager 2

    Выберите пользователя, под которым вы будете удалённо подключаться, и нажмите Изменить:

    Установите галочку напротив пункта «Удалённый доступ», при необходимости ограничьте удалённое подключение определённым списком IP-адресов. Нажмите Ok.

    Обратите внимание: если вид вашей панели управления отличается от представленного в статье, в разделе «Основная информация» переключите тему с paper_lantern на jupiter.

    Удаленный MySQL 1

    В разделе «Базы данных» выберите пункт Удаленный MySQL:

    Удаленный MySQL 1

    В открывшемся окне добавьте в поле «Узел» IP-адрес, с которого будет происходить удалённое подключение. Если у вас динамический IP-адрес, вы можете разрешить доступ для диапазона IP-адресов. Например, для IP-адреса начинающегося с 208.77.188, можно настроить доступ так, как показано на скриншоте. После этого нажмите Добавить узел:

    В панели управления Plesk возможность удалённого соединения включена по умолчанию.

    Какие данные необходимо использовать для удалённого подключения?

    Для удалённого соединения с базой данных (БД) и доступа к MySQL необходимо указывать следующие данные:

    • Server/Hostname (сервер базы данных): в качестве сервера необходимо указывать
      • имя сервера, на котором располагается ваша услуга хостинга (например, serverX.hosting.reg.ru, точное имя сервера вы можете уточнить в информационном письме),
      • либо IP-адрес сервера
      • либо доменное имя сайта (убедитесь, что домен припаркован к хостингу);

      Какие программы использовать для удалённого подключения MySQL

      Подключиться к базе данных вы можете с помощью программы «mysql». Пример удалённого подключения к базе данных на сервере «server90.hosting.reg.ru» под пользователем «u0015955_default»:

      mysql -p3306 -hserver90.hosting.reg.ru -uu0015955_default -p

      PuTTY

      Из соображений безопасности на виртуальном хостинге не предоставляется возможности настройки SSH-туннелирования для соединения с базой данных. Для этого мы рекомендуем приобрести VPS или выделенный сервер.

      Как изменить версию MySQL?

      На виртуальном хостинге доступны следующие версии MySQL: — MySQL Version 5.7.23(mysql Ver 14.14 Distrib 5.7.23-24, for Linux (x86_64) using 6.0).

      Как обновить mysql на хостинге? Изменить версию MySQL на виртуальном хостинге невозможно.

      Как удалить базу данных MySQL

      Удалить базу данных можно в одной из хостинг панелей. Войдите в вашу панель управления хостингом и следуйте соответствующей инструкции ниже:

      Ispmanager

      Перейдите в раздел «Базы данных». Выделите базу данных, которая вам больше не нужна, и нажмите Удалить:

      Удалить базу данных в ispmanager 6

      Базы данных MySQL 1

      В блоке «Базы данных» выберите пункт Базы данных MySQL:

      Базы данных MySQL 2

      Пролистайте страницу вниз до раздела «Текущие базы данных» и кликните Удалить напротив нужной базы: Обратите внимание: удаление пользователя базы данных при этом не происходит, его необходимо удалять отдельно. Процесс аналогичен.

      Перейдите в раздел «Базы данных» и на открывшейся странице нажмите Удалить базу данных напротив нужной базы.

      Полезные статьи при работе с базами данных MySQL:

      • Экспорт базы данных MySQL (export database)
      • Как очистить таблицу MySQL и очистить базу данных?

      Помогла ли вам статья?

      Спасибо за оценку. Рады помочь ��

      Карманный справочник: сравнение синтаксиса MS SQL Server и PostgreSQL

      Я занимаюсь переводом кода из MS SQL Server в PostgreSQL с начала 2019 года и сегодня продолжу сравнение этих СУБД.

      В прошлой публикации мы рассматривали отличия в быстродействии MS SQL Server и PostgreSQL для «1C».

      В Ozon есть решения и на MS SQL Server, и на PostgreSQL: первая используется в логистике и системах внутренних сервисов, вторая — в mission critical-подсистемах, от которых напрямую зависит бизнес компании (склад, корзина, оплата картами, платежи, информация о товарах на сайте и др.).

      Периодически появляются задачи перевода решений из огромных монолитных баз из MS SQL Server в PostgreSQL. Поэтому давайте сравним основные конструкции синтаксиса этих СУБД для правильного чтения кода, а также для того, чтобы быстро изменять код из MS SQL Server для PostgreSQL и наоборот.

      Начнём с сопоставления типов.

      Сопоставление типов

      DOUBLE PRECISION, FLOAT8

      INT, INTEGER, INT4

      TIMESTAMP(n) WITH TIME ZONE, TIMESTAMPTZ

      Примечание. Типы CHAR и VARCHAR лучше не использовать. Причины подробно описаны здесь.

      Более подробно о типах данных:

      Теперь перейдём к сопоставлению синтаксиса MS SQL Server и PostgreSQL.

      Сопоставление синтаксиса MS SQL Server и PostgreSQL

      I. Регистрозависимое обращение к схемам, таблицам (представлениям) и их полям и другим объектам базы данных

      В MS SQL Server при обращениях к объектам можно использовать квадратные скобки (они обязательны, только если в названии объекта или его поля присутствуют недопустимые символы):

      [schema] [table] [view] [object] [table].[field] [view].[field] [schema].[table] [schema].[view] [schema].[object] [schema].[table].[field] [schema].[view].[field]

      В PostgreSQL для этого используются двойные кавычки (они обязательны, только если в названии объекта присутствуют заглавные буквы или есть недопустимые символы в названии объекта или его поля):

      "schema" "table" "view" "table"."field" "view"."field" "schema"."table" "schema"."view" "schema"."table"."field" "schema"."view"."field"

      II. Выборка заданных N данных

      В MS SQL Server используется TOP:

      В PostgreSQL используется LIMIT:

      SELECT . LIMIT N;

      III. Постраничная загрузка данных (скользящее окно)
      Задача: извлечь 100 строк начиная с 202-й строки включительно по возрастанию даты рождения:

      SELECT *
      FROM tbl
      ORDER BY BirthDate ASC
      OFFSET 201 ROW FETCH
      NEXT 100 ROWS ONLY;

      select *
      from tbl
      order by BirthDate asc
      [—offset 201 row fetch
      next 100 rows only;]
      LIMIT 100 OFFSET 200

      Примечание. Вместо row можно использовать rows в любом месте запроса, а вместо next можно использовать first в обеих СУБД.

      IV. Выборка первого непустого значения

      V. Тернарный оператор IIF

      VI. Создание псевдонима

      VII. Выражения CASE

      VIII. Работа с переменными

      Объявление переменной

      Примечание. В MS SQL Server при объявлении переменных используется знак @ перед именем, а в PostgreSQL — нет. Также, помимо PL/pgSQL, в PostgreSQL можно встраивать и другие языки, такие как PL/Python и PL/Perl.

      Присвоение переменной значения

      SET @переменная = значение;

      Примечание. В PostgreSQL используется := для PL/pgSQL и просто = для PL/Python и PL/Perl.

      Вывод значения на консоль

      RAISERROR(@переменная, 1, 1) WITH NOWAIT;

      RAISE NOTICE ‘%’, ‘строка’;

      IX. Управление выполнением кода

      Выполнение скрипта

      В MS SQL Server:

      declare @_query int; set @_query=777; set @query=1+8; RAISERROR(@_query, 1, 1) WITH NOWAIT; --PRINT @_query;
      do $$ begin end; $$;

      Пример (вывод информации):

      do $$ declare _query int; begin _query:=777; _query:=1+8; RAISE NOTICE '%', _query; end; $$;

      Пример (передача значения клиенту):

      do $$ declare _query int; begin _query:=777; _query:=1+8; PERFORM set_config('my._query', _query::text, FALSE); end; $$; SELECT current_setting ('my._query');
      1. В DBeaver (бобре) нужно нажать CTRL+SHIFT+O при отсутствии окна вывода, а в pgAdmin вывод происходит автоматически.
      2. В psql и так всё работает.

      Цикл WHILE

      Логическое ветвление

      Более подробно про управление выполнением кода:

      1. Управление выполнением кода в MS SQL Server
      2. Управляющие структуры в PostgreSQL

      X. Функции для работы со строками

      Определение длины строки (количество символов в строке)

      Примечание. В MS SQL Server исключаются конечные пробелы. Если нужно учитывать и их, то необходимо воспользоваться функцией DATALENGTH (), которая возвращает суммарное количество байтов в символах строки.

      Возвращение символа по его коду:

      Конкатенация строк

      Нахождение позиции вхождения подстроки

      В MS SQL Server:

      Примечание. Точного соответствия не будет, если производить поиск не с начала строки.

      Регистронезависимое сравнение и поиск данных

      В MS SQL Server:

      2. lower(a) = lower(b) или upper(a)=upper(b)

      3. lower(a) <> lower(b) или upper(a)<>upper(b)

      4. lower(a) in (lower(b1), . ) или upper(a) in (upper(b1), . )

      Примечание. В PostgreSQL рекомендуется произвести оптимизацию через создание функционального индекса:

      create [concurrently] index idx_lower_ on . (lower()); --После создания concurrently-индекса, --его необходимо проверить на наличие битых индексов следующим запросом: SELECT indexrelid::regclass FROM pg_index where not indisvalid; --Далее для обновления статистики по нужной таблице --необходимо выполнить команду ANALYZE: ANALYZE ;

      Более подробно про команду ANALYZE.

      Слияние строк по запросу в одну строку по заданному разделителю

      В MS SQL Server можно использовать функцию STUFF следующим образом:

      STUFF(( SELECT DISTINCT ', ' + CONVERT(varchar, tbl.) FROM . tbl [WHERE ] FOR XML PATH('')) , 1 , 1 , '') AS STUFF_tbl;

      Также начиная с версии 2017 доступна функция STRING_AGG.

      В PostgreSQL для этого можно использовать функцию string_agg таким образом:

      string_agg((SELECT distinct ', ' || cast(tbl. as VARCHAR) FROM . tbl, [WHERE ] ), 1, 1, '') AS string_agg_field;

      Более подробно про функции для работы со строками:

      XI. Функции для работы с датой и временем

      Получение текущей даты и времени (локальное время)

      Получение текущей даты

      CAST(GetDate() as DATE)

      Пример преобразования формата даты и времени из строки public_date:

      В MS SQL Server:

      FORMAT(public_date, 'dd.MM.yyyy HH:mm:ss', 'ru-RU') — предпочтительный способ convert(varchar(32),convert(datetime,public_date,104),120)
      to_char(to_timestamp(public_date, 'dd.MM.yyyy hh24.mi'), 'yyyy-mm-dd hh24:mi:ss')

      Приращение даты/времени

      В MS SQL Server:

      DateAdd(datepart, count, dt);

      dt + (count * interval ‘1 datepart’);
      или
      dt + interval ‘count datepart’;

      Более подробно про функции для работы с датой и временем:

      XII. Получение количества строк, затронутых при выполнении последней команды

      XIII. Выполнение динамического SQL-кода

      XIV. Проверка и приведение типов

      Проверка строки на то, что она является числом

      В MS SQL Server:

      CREATE OR REPLACE FUNCTION dbo.isnumeric(_input varchar(255) DEFAULT NULL::varchar(255)) RETURNS bit LANGUAGE plpgsql AS $function$ /* Проверяет, является ли входная строка числом */ declare _result bit; begin begin perform _input::numeric; _result:=1::bit; exception when others THEN _result:=0::bit; end; return _result; end; $function$ ;

      Безопасное приведение типа

      В MS SQL Server:

      try_cast(val as )

      Примечание. try_cast в MS SQL Server возвращает NULL, если значение невозможно привести к заданному типу, в других случаях — работает как оператор CAST.

      В PostgreSQL есть два способа:

      1) через обработку ошибок:

      declare _result оператор CAST ; . BEGIN _result := cast(val as ); exception when others then _result :=null; end;

      2) через реализацию функции:

      CREATE OR REPLACE FUNCTION dbo.try_cast(value character varying, typename CHARACTER varying) returns text LANGUAGE plpgsql AS $function$ declare _sql_command text; DECLARE _result text; begin _result=value; _sql_command := 'select cast('||''''|| value||''''||' as '|| typename||');'; BEGIN execute _sql_command; exception when others then _result :=null; end; return _result; end; $function$ ;

      Функция в итоге не возвращает преобразованное в заданный тип значение.
      Функция на вход принимает текст и возвращает текст.
      Если значение невозможно привести к заданному типу, то возвращается NULL.

      Пример использования (чтобы было как в MS SQL Server):

      cast(dbo.try_cast(val::text, '') as )

      XV. DML-команды

      Обновление данных

      Пример в MS SQL Server:

      Обновление поля Name в таблице Production.ScrapReason для тех строк, для которых есть соответствующие записи в таблице Production.WorkOrder по равенству ScrapReasonID и у которых значение ScrappedQty больше 300:

      UPDATE sr SET sr.Name = 'Name' OUTPUT deleted.* , inserted.* FROM Production.ScrapReas sr JOIN Production.WorkOrder wo ON (sr.ScrapReasonID = wo.ScrapReasonID) AND (wo.ScrappedQty > 300);

      Ключевое слово OUTPUT позволяет получить данные об обновлении.

      Пример в PostgreSQL:

      Обновление поля Name в таблице production.scrapreason для тех строк, для которых есть соответствующие записи в таблице production.workorder по равенству scrapreasonid и у которых значение scrappedqty больше 300:

      update production.scrapreason as sr set sr.Name = 'Name' from production.workorder as wo where (sr.scrapreasoid = wo.scrapreasonoid) and (wo.scrappedqty > 300) returning *;

      Ключевое слово returning позволяет получить данные об обновлении.

      Более подробно о команде UPDATE:

      Удаление данных

      Пример в MS SQL Server:

      Удаление из таблицы Sales.SalesPersonQuotaHistory тех записей, для которых есть соответствующие записи в таблице Sales.SalesPerson по равенству BusinessEntityID и у которых значение SalesYTD больше 2500000.00:

      DELETE FROM spqh OUTPUT deleted.* FROM Sales.SalesPersonQuotaHistory spqh INNER JOIN Sales.SalesPerson sp ON (spqh.BusinessEntityID = sp.BusinessEntityID) WHERE (sp.SalesYTD > 2500000.00);

      Ключевое слово OUTPUT позволяет получить данные об удалении.

      Пример в PostgreSQL:

      Удаление из таблицы sales.salespersonquotahistory тех записей, для которых есть соответствующие записи в таблице sales.salesperson по равенству businessentitid и у которых значение salesytd больше 2500000.00:

      delete from sales.salespersonquotahistory AS spqh using sales.salesperson AS sp where (spqh.businessentityid = sp.businessentitid) and (sp.salesytd > 2500000.00) returning *;

      Ключевое слово returning позволяет получить данные об удалении.

      Более подробно о команде DELETE:

      Получение изменённых записей

      В MS SQL Server:

      insert/update/delete таблица
      Output deleted/inserted.
      into [@/#]
      Values|From

      insert/update/delete таблица
      values()|from |using
      returning *, столбец/столбцы

      В update есть доступ только к inserted.

      Примечание. В PostgreSQL не нужна промежуточная таблица для получения изменённых записей.

      Удаление дубликатов (дублирующих строк):

      В MS SQL Server:

      with dbl_in_stage as ( select row_number() over (partition by , . order by 1) as rn from . as stg ) delete from dbl_in_stage where rn > 1;
      with x as ( select a, ctid, row_number() over(partition by a order by ctid) rn from t ) delete from t using x where t.a = x.a and t.ctid = x.ctid and x.rn > 1;

      или более сложный вариант:

      delete from . where ctid=any( array(select unnest(ctids[2:]) from ( select array_agg( ctid order by string_to_array( regexp_replace(ctid::text, E'\\(|\\)','','g'),',')::bigint[]) ctids FROM . as T group by T::text) as T)::tid[]);

      Примечание. Оптимальный вариант — внести в таблицу уникальный ключ, так как работа с метаданными увеличивает нагрузку на систему.

      При наличии уникального ключа удалять дубликаты в PostgreSQL можно следующим образом:

      delete from . where in (select from ( select *, row_number() over (partition by , . order by 1) as rn from . ) as tbl where rn > 1);

      XVI. DDL-команды для работы с таблицами

      Удаление таблицы с предварительной проверкой

      В MS SQL Server:

      Для основной таблицы:

      DROP TABLE IF EXISTS .;

      Для локальной временной таблицы:

      IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#%') BEGIN DROP TABLE #; END;

      Для глобальной временной таблицы:

      IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '##%') BEGIN DROP TABLE ##; END;

      Все временные таблицы живут, либо пока активна сессия, во время которой они были созданы, либо пока их явно не удалят.

      Для основной таблицы:

      drop table if exists .;

      Для временной таблицы:

      drop table if exists ;

      Более детально про удаление таблиц:

      Создание таблицы через выборку

      В MS SQL Server:

      Для основной таблицы:

      select . into from …

      Для временной таблицы:

      select . into # from …

      Для основной таблицы:

      create table as select . 

      Для временной таблицы:

      create temp table as select …

      Более детально про создание таблиц через выборку:

      Создание/изменение и удаление значения по умолчанию для колонки таблицы

      В MS SQL Server:

      ALTER TABLE . ADD CONSTRAINT DEFAULT FOR ;

      Выборка всех значений по умолчанию:

      SELECT SCHEMA_NAME(t.[schema_id]) AS sch , t.name AS tbl , col.name AS colname , dc.definition AS def FROM sys.default_constraints dc INNER JOIN sys.columns col ON dc.parent_object_id = col.[object_id] INNER JOIN sys.tables t ON t.[object_id] = col.[object_id];
      DROP DEFAULT IF EXISTS ;

      Изменение происходит через удаление и добавление.

      Создание и изменение:

      alter table . alter column set default ;

      Выборка всех значений по умолчанию:

      select col.table_schema, col.table_name, col.column_name, col.column_default from information_schema.columns as col;
      alter table . alter column drop default;

      Изменение типа колонки таблицы

      В MS SQL Server:

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

      Перенос автоинкрементных полей

      В MS SQL Server делаем запрос вида:

      SELECT 'do $$ declare start_with_val bigint; declare sql_statement varchar; begin start_with_val := coalesce((select max(' + c.[name] + ') from ' + s.[name] + '.' + o.[name] + '),0)+1; sql_statement := ''alter table ' + s.[name] + '.' + o.[name] + ' alter ' + c.[name] + ' add generated by default as identity (start with '' || cast(start_with_val as varchar)||'');''; execute sql_statement; end; $$;' AS plsql_statement --select distinct s.name FROM sys.all_columns c INNER JOIN sys.all_objects o ON o.[object_id] = c.[object_id] INNER JOIN sys.schemas s ON s.[schema_id] = o.[schema_id] WHERE is_identity <> 0 AND SCHEMA_NAME(o.[schema_id]) <> 'sys' AND o.[type] = 'U';
      do $$ declare start_with_val bigint; declare sql_statement varchar; begin start_with_val := coalesce((select max(ID) from dbo.ExchangeQueue),0)+1; sql_statement := 'alter table dbo.ExchangeQueue alter ID add generated by default as identity (start with ' || cast(start_with_val as varchar)||');'; EXECUTE sql_statement; end; $$;

      Полученные скрипты применяем на стороне PostgreSQL.

      Создание автоинкрементных полей

      В MS SQL Server:

      ALTER TABLE [схема].[таблица] ADD bigint IDENTITY(1, 1) NOT NULL;
      do $$ DECLARE start_with_val bigint; DECLARE sql_statement varchar; BEGIN start_with_val := coalesce((select max() from .),0)+1; sql_statement := 'alter table . alter add generated by default as identity (start with ' || cast(start_with_val as varchar)||');'; EXECUTE sql_statement; END; $$;

      Более детально про создание таблиц:

      Более детально про изменение таблиц:

      XVII. Создание и изменение представления

      В MS SQL Server:

      CREATE OR ALTER VIEW

      create or replace view

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

      Более подробно про создание и изменение представлений:

      XVIII. Построчная обработка строк в наборе

      В MS SQL Server:

      --объявление переменных @field_1, . @field_N DECLARE CURSOR LOCAL FOR ; OPEN ; FETCH NEXT FROM INTO @field_1, . @field_N; WHILE (@@FETCH_STATUS = 0) BEGIN --оперируем значениями переменных @field_1, . @field_N . FETCH NEXT FROM INTO @field_1, . @field_N; END CLOSE ; DEALLOCATE ;
      do $$ declare _val record; begin drop table if exists _tmp_tbl; create temp table _tmp_tbl as for _val in (select field_1, . field_n from_tmp_tbl) loop --можно обратиться к любому выбранному ранее полю через _val.. Например, _val. end loop; end $$

      XIX. Системные информационные функции безопасности

      Текущий пользователь

      В MS SQL Server используется функция CURRENT_USER().

      1. session_user — под каким пользователем открыта сессия
      2. current_user (или просто user) — под каким контекстом (ролью) идёт выполнение (session_user переключается для выполнения — здесь важно, под каким правом делается переключение)

      Получение имени экземпляра и IP-адреса сервера СУБД

      В MS SQL Server:

      Получить информацию об IP-адресе сервера СУБД:

      SELECT CONNECTIONPROPERTY(' net_transport') AS net_transport , CONNECTIONPROPERTY(' protocol_type') AS protocol_type , CONNECTIONPROPERTY(' auth_scheme') AS auth_scheme , CONNECTIONPROPERTY(' local_net_address') AS local_net_address , CONNECTIONPROPERTY(' local_tcp_port') AS local_tcp_port , CONNECTIONPROPERTY(' client_net_address') AS client_net_address;

      Получить название экземпляра СУБД:

      SELECT @@SERVERNAME;

      Получить IP-адрес сервера СУБД:

      do $$ declare title varchar(100) :=host(inet_server_addr()); begin raise notice '%', title; end; $$;

      Получение названия экземпляра СУБД пока не реализовано.

      Более подробно про системные информационные функции безопасности:

      XX. Определение и вызов хранимой процедуры

      Определение хранимой процедуры

      CREATE OR ALTER PROCEDURE [схема].[назание_процедуры] [=], . AS BEGIN . END
      CREATE OR REPLACE PROCEDURE . ( [INOUT] [=], . ) LANGUAGE plpgsql AS $body$ [] BEGIN . END; $body$ ;

      Вызов хранимой процедуры

      В MS SQL Server:

      EXEC . =, . OUT[PUT];
      call . ( =, . );

      XXI. Создание скалярной функции

      CREATE OR ALTER FUNCTION [схема].[название_функции] ( [=], . ) RETURNS AS BEGIN . RETURN . END
      CREATE OR REPLACE FUNCTION . ( [=], . ) RETURNS LANGUAGE plpgsql AS $body$ [] begin . return ( select . ); end; $body$ ;

      XXII. Передача табличного значения (вывод таблицы)

      В MS SQL Server:

      CREATE OR ALTER PROCEDURE [схема].[название_хранимой_процедуры] , .  AS BEGIN . SELECT . END
      create or replace function . ( , . ) return table ( , . ) language 'plpgsql' as $body$ [] begin return query (select . ); end; $body$;

      XXIII. DML-триггеры

      Пример в MS SQL Server:

      CREATE TRIGGER [info].[tr_isupoll_question_text_last_update_trigger] ON [info].[isupoll_question_text] FOR UPDATE AS UPDATE info.isupoll_question_text SET last_update_date = GETDATE() , last_update_user = SUSER_NAME() FROM info.isupoll_question_text ds INNER JOIN INSERTED i ON ds.isupoll_question_text_id = i.isupoll_question_text_id;

      Здесь создаётся триггер tr_isupoll_question_text_last_update_trigger для таблицы info.isupoll_question_text после обновления данных, который для обновляемых строк проставляет текущие дату, время и пользователя соответственно.

      DROP TRIGGER IF EXISTS [tr_isupoll_question_text_last_update_trigger] on [info].[isupoll_question_text];

      Здесь удаляется триггер tr_isupoll_question_text_last_update_trigger для таблицы info.isupoll_question_text

      Пример в PostgreSQL:

      CREATE OR REPLACE FUNCTION dbo.update_mod() RETURNS trigger LANGUAGE plpgsql AS $function$ begin new.last_update_date=now(); new.last_update_user=session_user; return new; end; $function$ ;

      Здесь создаётся функция dbo.update_mod(), которая заполняет два поля текущими датой, временем и пользователем соответственно.

      create trigger tr_isupoll_question_text_last_update_trigger before update on info.isupoll_question_text for each row execute function dbo.update_mod();

      Здесь создаётся триггер tr_isupoll_question_text_last_update_trigger для таблицы info.isupoll_question_text до обновления данных, который для каждой строки вызывает выполнение функции dbo.update_mod().

      drop trigger if exists tr_isupoll_question_text_last_update_trigger on info.isupoll_question_text;

      Здесь удаляется триггер tr_isupoll_question_text_last_update_trigger для таблицы info.isupoll_question_text.

      Важно! В триггере используйте ключевое слово before, когда хотите нашкодничать в той же таблице, для которой создаётся триггер, и after — для логирования в другую таблицу.

      Более подробно про DML-триггеры:

      И в качестве бонуса кратко рассмотрим сопоставление основных системных представлений и приведём ссылки для мониторинга.

      Немного о сопоставлении системных представлений и мониторинге

      Сопоставление системных представлений

      MS SQL Server

      PostgreSQL

      Описание

      Почему в названии mysql присутствуют буквы sql

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

      6.1.1.1. Cтроки

      Строка представляет собой последовательность символов, заключенных либо в одинарные кавычки (‘ ‘ ’) — апострофы, либо в двойные кавычки (‘ » ’). При использовании диалекта ANSI SQL допустимы только одинарные кавычки. Например:

      'a string' "another string"

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

      • \0 Символ 0 ( NUL ) в ASCII коде.
      • \’ Символ одиночной кавычки (‘ ‘ ’).
      • \» Символ двойной кавычки (‘ » ’).
      • \b Возврат на один символ.
      • \n Символ новой строки (перевода строки).
      • \r Символ перевода каретки.
      • \t Символ табуляции.
      • \z Символ (Control-Z) таблицы ASCII(26). Данный символ можно закодировать, чтобы обойти проблему, заключающуюся в том, что под Windows ASCII(26) означает конец файла (проблемы возникают при использовании ASCII(26) в выражении mysql database < filename) .
      • \\ Символ обратного слеша.
      • \% Символ процентов ‘ % ’. Используется для поиска копий литерала ‘ % ’ в контекстах, где выражение ‘ % ’ в противном случае интерпретировалось бы как групповой символ (see Раздел 6.3.2.1, «Функции сравнения строк»).
      • \’_’ Символ подчеркивания ‘ _ ’. Используется для поиска копий литерала ‘ _ ’ в контекстах, где выражение ‘ _ ’ в противном случае интерпретировалось бы как групповой символ (see Раздел 6.3.2.1, «Функции сравнения строк»).

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

      Существует несколько способов включить кавычки в строку:

      • Одиночная кавычка (апостроф) ‘ ‘ ’ внутри строки, заключенной в кавычки ‘ ‘ ’, может быть записана как ‘ » ‘.
      • Двойная кавычка ‘ » ’ внутри строки, заключенной в двойные кавычки ‘ » ’, может быть записана как ‘ «» ‘.
      • Можно предварить символ кавычки символом экранирования (‘ \ ’).
      • Для символа ‘ ‘ ’ внутри строки, заключенной в двойные кавычки, не требуется специальной обработки; его также не требуется дублировать или предварять обратным слешем. Точно так же не требует специальной обработки двойная кавычка ‘ » ’ внутри строки, заключенной в одиночные кавычки ‘ ‘ ’.

      Ниже показаны возможные варианты применения кавычек и escape-символа на примерах выполнения команды 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 ), следующие символы должны быть представлены как escape-последовательности:

      • NUL ASCII 0. Необходимо представлять в виде ‘ \0 ‘ (обратный слеш и символ ASCII ‘ 0 ’).
      • \ ASCII 92, обратный слеш. Представляется как ‘ \\ ‘.
      • ‘ ASCII 39, единичная кавычка. Представляется как ‘ \’ ‘.
      • » ASCII 34, двойная кавычка. Представляется как ‘ \» ‘.

      При написании программы на языке C для добавления символов экранирования в команде INSERT можно использовать функцию mysql_real_escape_string() из C API (see Раздел 8.4.2, «Обзор функций интерфейса C»). При программировании на Perl можно использовать метод quote из пакета DBI для превращения специальных символов в соответствующие escape-последовательности (see Раздел 8.2.2, «Интерфейс DBI »).

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

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

      6.1.1.2. Числа

      Целые числа представляются в виде последовательности цифр. Для чисел с плавающей точкой в качестве разделителя десятичных знаков используется символ ‘ . ’. Числа обоих типов могут предваряться символом ‘ — ’, обозначающим отрицательную величину.

      Примеры допустимых целых чисел:

      1221 0 -32

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

      294.42 -32032.6809e+10 148.00

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

      6.1.1.3. Шестнадцатеричные величины

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

      mysql> SELECT x'4D7953514C'; -> MySQL mysql> SELECT 0xa+0; -> 10 mysql> SELECT 0x5061756c; -> Paul

      Синтаксис выражений вида x’hexstring’ (новшество в версии 4.0) базируется на ANSI SQL, а для обозначений вида 0x используется синтаксис ODBC. Шестнадцатеричные строки часто применяются в ODBC для представления двоичных типов данных вида BLOB . Для конвертирования строки или числа в шестнадцатеричный вид можно применять функцию HEX() .

      6.1.1.4. Значения NULL

      Значение NULL означает «отсутствие данных». Они является отличным от значения 0 для числовых типов данных или пустой строки для строковых типов (see Раздел A.5.3, «Проблемы со значением NULL »).

      При использовании форматов импорта или экспорта текстовых файлов ( LOAD DATA INFILE, SELECT . INTO OUTFILE ) NULL можно представить как \N (see Раздел 6.4.9, «Синтаксис оператора LOAD DATA INFILE »).

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

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

      Следует отметить, что эти правила были изменены, начиная с версии MySQL 3.23.6, когда было разрешено брать в одиночные скобки ‘ ` ’ идентификаторы (имена баз данных, таблиц и столбцов). Двойные скобки ‘ » ’ тоже допустимы — при работе в режиме ANSI SQL (see Раздел 1.9.2, «Запуск MySQL в режиме ANSI»).

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

      Необходимо также учитывать, что не следует использовать символы ASCII(0) , ASCII(255) или кавычки в самом идентификаторе.

      Кроме того, если имя идентификатора относится к служебным словам или содержит специальные символы, необходимо всегда заключать его в обратные кавычки ` при использовании в выражениях:

      mysql> SELECT * FROM `select` WHERE `select`.id > 100; 

      В предыдущих версиях MySQL (до 3.23.6) для имен существовали следующие правила:

      • Имя может состоять из буквенно-цифровых символов установленного в данное время алфавита и символов ‘ _ ’ and ‘ $ ’. Тип кодировки по умолчанию — ISO-8859-1 Latin1, он может быть изменен указанием иного типа в аргументе параметра —default-character-set mysqld (see Раздел 4.6.1, «Набор символов, применяющийся для записи данных и сортировки»).
      • Имя может начинаться с любого допустимого символа, в частности, с цифры (в этом состоит отличие от правил, принятых во многих других базах данных). Однако имя не может состоять только из цифр.
      • Не допускается использование в именах символа ‘ . ’, так как он применяется для расширения формата имени (посредством чего можно ссылаться на столбцы — см. в этом же разделе ниже).

      Не рекомендуется использовать имена, подобные 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 3.22 или более поздних.
      `column_name` Имя столбца является ключевым словом или содержит специальные символы.

      Нет необходимости указывать префикс tbl_name или db_name.tbl_name в ссылке на столбец в каком-либо утверждении, если эта ссылка не будет неоднозначной. Например, предположим, что каждая из таблиц t1 и t2 содержит столбец 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 ставят в начале имен таблиц в качестве префикса символ ‘ . ’.

      6.1.3. Чувствительность имен к регистру

      В MySQL имена баз данных и таблиц соответствуют директориям и файлам внутри директорий. Следовательно, чувствительность к регистру операционной системы, под которой работает MySQL, определяет чувствительность к регистру имен баз данных и таблиц. Это означает, что имена баз данных и таблиц нечувствительны к регистру под Windows, а под большинством версий Unix проявляют чувствительность к регистру. Одно большое исключение здесь это Mac OS X, когда файловая система по умолчанию HFS+ используется. Однако Mac OS X также поддерживает тома UFS, которые чувствительны к регистру под Mac OS X также как и на Unix. See Раздел 1.9.3, «Расширения 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 при сохранении и поиске будет преобразовывать все имена таблиц к нижнему регистру. С версии 4.0.2 это также касается и имен баз данных. Обратите внимание на то, что при изменении этого параметра перед запуском mysqld необходимо прежде всего преобразовать имена всех старых таблиц к нижнему регистру.

      При переносе MyISAM -файлов с Windows на диск в Unix в некоторых случаях будет полезна утилита mysql_fix_extensions для приведения в соответствие регистров расширений файлов в каждой указанной директории базы данных (нижний регистр .frm , верхний регистр .MYI и .MYD ). Утилиту mysql_fix_extensions можно найти в подкаталоге scripts .

      6.1.4. Переменные пользователя

      Для конкретного процесса пользователь может определить локальные переменные, которые в MySQL обозначаются как @variablename . Имя локальной переменной может состоять из буквенно-цифровых символов установленного в данное время алфавита и символов ‘ _ ’, ‘ $ ’, and ‘ . ’. Тип кодировки по умолчанию — ISO-8859-1 Latin1, он может быть изменен указанием иного типа в аргументе параметра —default-character-set mysqld (see Раздел 4.6.1, «Набор символов, применяющийся для записи данных и сортировки»).

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

      Локальную переменную можно объявить, используя синтаксис команды SET :

      SET @variable= < integer expression | real expression | string expression >[,@variable= . ].

      Можно также определить значение переменной иным способом, без команды SET . Однако в этом случае в качестве оператора присвоения более предпочтительно использовать оператор ‘ := ‘, чем оператор ‘ = ’, так как последний зарезервирован для сравнения выражений, не связанных с установкой переменных:

      mysql> 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 , or ORDER BY не следует ссылаться на выражение, содержащее переменные, которые введены в части SELECT этой команды. Например, следующая команда НЕ будет выполняться так, как ожидалось:

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

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

      Действует правило никогда не создавать и не использовать одну и ту же переменную в одном и том же выражении SQL.

      6.1.5. Системные переменные

      Начиная с MySQL 4.0.3 мы предоставляем лучший доступ к большинству системных переменных и переменных, относящихся к соединению. Можно менять теперь большую часть переменных без необходимости останавливать сервер.

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

      Когда mysqld запускается, все глобальные переменные инициализируются из командной строки и файлов опций. Вы можете изменять значения с помощью SET GLOBAL . Когда новый поток создается, потоковые переменные инициализируются из глобальных и они не меняются даже если вы даете новую команду SET GLOBAL .

      Для установки глобальной переменной, используйте один из таких синтаксисов: (Здесь используется sort_buffer_size в качестве примера)

      SET GLOBAL sort_buffer_size=value; SET @@global.sort_buffer_size=value;

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

      SET SESSION sort_buffer_size=value; SET @@session.sort_buffer_size=value; SET sort_buffer_size=value;

      Если вы не указываете режим, то тогда подразумевается SESSION . See Раздел 5.5.6, «Синтаксис команды SET ».

      LOCAL — синоним для SESSION .

      Для получения значения глобальной переменной используйте одну из этих команд:

      SELECT @@global.sort_buffer_size; SHOW GLOBAL VARIABLES like 'sort_buffer_size';

      Для получения значения потоковой переменной используйте одну из этих команд:

      SELECT @@session.sort_buffer_size; SHOW SESSION VARIABLES like 'sort_buffer_size';

      Когда вы запрашиваете значение переменной с помощью синтаксиса @@variable_name и не укзываете GLOBAL или SESSION , то тогда MySQL вернет потоковое значение этой переменное, если таковое существует. Если нет, то MySQL вернет глобальное значение.

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

      Далее идет полный список всех переменных которые вы можете изменять и значения которых можете получать, а также информация о том, можете ли вы использовать SESSION или GLOBAL с ними.

      Переменная Тип значения Тип
      autocommit булевое SESSION
      big_tables булевое SESSION
      binlog_cache_size число GLOBAL
      bulk_insert_buffer_size число GLOBAL | SESSION
      concurrent_insert булевое GLOBAL
      connect_timeout число GLOBAL
      convert_character_set строка SESSION
      delay_key_write OFF | ON | ALL GLOBAL
      delayed_insert_limit число GLOBAL
      delayed_insert_timeout число GLOBAL
      delayed_queue_size число GLOBAL
      error_count число LOCAL
      flush булевое GLOBAL
      flush_time число GLOBAL
      foreign_key_checks булевое SESSION
      identity число SESSION
      insert_id булевое SESSION
      interactive_timeout число GLOBAL | SESSION
      join_buffer_size число GLOBAL | SESSION
      key_buffer_size число GLOBAL
      last_insert_id булевое SESSION
      local_infile булевое GLOBAL
      log_warnings булевое GLOBAL
      long_query_time число GLOBAL | SESSION
      low_priority_updates булевое GLOBAL | SESSION
      max_allowed_packet число GLOBAL | SESSION
      max_binlog_cache_size число GLOBAL
      max_binlog_size число GLOBAL
      max_connect_errors число GLOBAL
      max_connections число GLOBAL
      max_error_count число GLOBAL | SESSION
      max_delayed_threads число GLOBAL
      max_heap_table_size число GLOBAL | SESSION
      max_join_size число GLOBAL | SESSION
      max_sort_length число GLOBAL | SESSION
      max_tmp_tables число GLOBAL
      max_user_connections число GLOBAL
      max_write_lock_count число GLOBAL
      myisam_max_extra_sort_file_size число GLOBAL | SESSION
      myisam_max_sort_file_size число GLOBAL | SESSION
      myisam_sort_buffer_size число GLOBAL | SESSION
      net_buffer_length число GLOBAL | SESSION
      net_read_timeout число GLOBAL | SESSION
      net_retry_count число GLOBAL | SESSION
      net_write_timeout число GLOBAL | SESSION
      query_cache_limit число GLOBAL
      query_cache_size число GLOBAL
      query_cache_type enum GLOBAL
      read_buffer_size число GLOBAL | SESSION
      read_rnd_buffer_size число GLOBAL | SESSION
      rpl_recovery_rank число GLOBAL
      safe_show_database булевое GLOBAL
      server_id число GLOBAL
      slave_compressed_protocol булевое GLOBAL
      slave_net_timeout число GLOBAL
      slow_launch_time число GLOBAL
      sort_buffer_size число GLOBAL | SESSION
      sql_auto_is_null булевое SESSION
      sql_big_selects булевое SESSION
      sql_big_tables булевое SESSION
      sql_buffer_result булевое SESSION
      sql_log_binlog булевое SESSION
      sql_log_off булевое SESSION
      sql_log_update булевое SESSION
      sql_low_priority_updates булевое GLOBAL | SESSION
      sql_max_join_size число GLOBAL | SESSION
      sql_quote_show_create булевое SESSION
      sql_safe_updates булевое SESSION
      sql_select_limit булевое SESSION
      sql_slave_skip_counter число GLOBAL
      sql_warnings булевое SESSION
      table_cache число GLOBAL
      table_type enum GLOBAL | SESSION
      thread_cache_size число GLOBAL
      timestamp булевое SESSION
      tmp_table_size enum GLOBAL | SESSION
      tx_isolation enum GLOBAL | SESSION
      version строка GLOBAL
      wait_timeout число GLOBAL | SESSION
      warning_count число LOCAL
      unique_checks булевое SESSION

      Переменные, помеченные как число могут иметь числовое значение. Переменные, помеченные как булевое могут быть установлены в 0 , 1 , ON или OFF . Переменные типа enum должны в общем случае быть установлены в одно из возможных значений для переменной, но также могут быть установлены в значение числа, соответствующего значению выбора enum. Первый элемент списка enum — номер 0.

      Вот описание некоторых переменных:

      Переменная Описание
      identity Синоним для last_insert_id (совместимость с Sybase)
      sql_low_priority_updates Синоним для low_priority_updates
      sql_max_join_size Синоним для max_join_size
      delay_key_write_for_all_tables Если это и delay_key_write установлены, то тогда все вновь открываемые таблицы MyISAM открываются с задержкой записи ключей.
      version Синоним для VERSION() (совместимость (?) с Sybase)

      Описания других переменных можно найти в описании переменных запуска mysql , в описании команды SHOW VARIABLES и в разделе SET . See Раздел 4.1.1, «Параметры командной строки mysqld ». See Раздел 4.5.6.4, « SHOW VARIABLES ». See Раздел 5.5.6, «Синтаксис команды SET ».

      6.1.6. Синтаксис комментариев

      Сервер MySQL поддерживает следующие способы задания комментариев: с помощью символа ‘ # ’, за которым следует текст комментария до конца строки; с помощью двух символов — , за которыми идет текст комментария до конца строки; и (для многострочных комментариев) с помощью символов /* (начало комментария) и */ (конец комментария):

      mysql> SELECT 1+1; # Этот комментарий продолжается до конца строки mysql> SELECT 1+1; -- Этот комментарий продолжается до конца строки mysql> SELECT 1 /* Это комментарий в строке */ + 1; mysql> SELECT 1+ /* Это многострочный комментарий */ 1;

      Обратите внимание: при использовании для комментирования способа с — (двойное тире) требуется наличие хотя бы одного пробела после второго тире!

      Хотя сервер «понимает» все описанные выше варианты комментирования, существует ряд ограничений на способ синтаксического анализа комментариев вида /* . */ клиентом mysql :

      • Символы одинарной и двойной кавычек, даже внутри комментария, считаются началом заключенной в кавычки строки. Если внутри комментария не встречается вторая такая же кавычка, синтаксический анализатор не считает комментарий законченным. При работе с mysql в интерактивном режиме эта ошибка проявится в том, что окно запроса изменит свое состояние с mysql> на ‘> или «> .
      • Точка с запятой используется для обозначения окончания данной SQL-команды и что-либо, следующее за этим символом, указывает на начало следующего выражения.

      Эти ограничения относятся как к интерактивному режиму работы mysql (из командной строки), так и к вызову команд из файла, читаемого с ввода командой mysql < some-file .

      MySQL поддерживает принятый в ANSI SQL способ комментирования с помощью двойного тире ‘ — ‘ только в том случае, если после второго тире следует пробел (see Раздел 1.9.4.7, «Символы `—‘ как начало комментария»).

      6.1.7. «Придирчив» ли MySQL к зарезервированным словам?

      Это общая проблема, возникающая при попытке создать таблицу с именами столбцов, использующих принятые в MySQL названия типов данных или функций, такие как TIMESTAMP или GROUP . Иногда это возможно (например, ABS является разрешенным именем для столбца), но не допускается пробел между именем функции и сразу же следующей за ним скобкой ‘ ( ’ при использовании имен функций, совпадающих с именами столбцов.

      Следующие слова являются зарезервированными в MySQL. Большинство из них не допускаются в ANSI SQL92 как имена столбцов и/или таблиц (например GROUP). Некоторые зарезервированы для нужд MySQL и используются (в настоящее время) синтаксическим анализатором yacc :

      ADD ALL ALTER
      ANALYZE AND AS
      ASC BEFORE BETWEEN
      BIGINT BINARY BLOB
      BOTH BY CASCADE
      CASE CHANGE CHAR
      CHARACTER CHECK COLLATE
      COLUMN COLUMNS CONSTRAINT
      CONVERT CREATE CROSS
      CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP
      CURRENT_USER DATABASE DATABASES
      DAY_HOUR DAY_MICROSECOND DAY_MINUTE
      DAY_SECOND DEC DECIMAL
      DEFAULT DELAYED DELETE
      DESC DESCRIBE DISTINCT
      DISTINCTROW DIV DOUBLE
      DROP DUAL ELSE
      ENCLOSED ESCAPED EXISTS
      EXPLAIN FALSE FIELDS
      FLOAT FLOAT4 FLOAT8
      FOR FORCE FOREIGN
      FROM FULLTEXT GRANT
      GROUP HAVING HIGH_PRIORITY
      HOUR_MICROSECOND HOUR_MINUTE HOUR_SECOND
      IF IGNORE IN
      INDEX INFILE INNER
      INSERT INT INT1
      INT2 INT3 INT4
      INT8 INTEGER INTERVAL
      INTO IS JOIN
      KEY KEYS KILL
      LEADING LEFT LIKE
      LIMIT LINES LOAD
      LOCALTIME LOCALTIMESTAMP LOCK
      LONG LONGBLOB LONGTEXT
      LOW_PRIORITY MATCH MEDIUMBLOB
      MEDIUMINT MEDIUMTEXT MIDDLEINT
      MINUTE_MICROSECOND MINUTE_SECOND MOD
      NATURAL NOT NO_WRITE_TO_BINLOG
      NULL NUMERIC ON
      OPTIMIZE OPTION OPTIONALLY
      OR ORDER OUTER
      OUTFILE PRECISION PRIMARY
      PRIVILEGES PROCEDURE PURGE
      READ REAL REFERENCES
      REGEXP RENAME REPLACE
      REQUIRE RESTRICT REVOKE
      RIGHT RLIKE SECOND_MICROSECOND
      SELECT SEPARATOR SET
      SHOW SMALLINT SONAME
      SPATIAL SQL_BIG_RESULT SQL_CALC_FOUND_ROWS
      SQL_SMALL_RESULT SSL STARTING
      STRAIGHT_JOIN TABLE TABLES
      TERMINATED THEN TINYBLOB
      TINYINT TINYTEXT TO
      TRAILING TRUE UNION
      UNIQUE UNLOCK UNSIGNED
      UPDATE USAGE USE
      USING UTC_DATE UTC_TIME
      UTC_TIMESTAMP VALUES VARBINARY
      VARCHAR VARCHARACTER VARYING
      WHEN WHERE WITH
      WRITE XOR YEAR_MONTH
      ZEROFILL

      Следующие слова являются новыми зарезервированными словами в MySQL 4.0:

      CHECK FORCE LOCALTIME
      LOCALTIMESTAMP REQUIRE SQL_CALC_FOUND_ROWS
      SSL XOR

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

      6.2. Типы данных столбцов

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

      Ниже перечислены типы столбцов, поддерживаемые MySQL. В описаниях используются следующие обозначения:

      • M Указывает максимальный размер вывода. Максимально допустимый размер вывода составляет 255 символов.
      • D Употребляется для типов данных с плавающей точкой и указывает количество разрядов, следующих за десятичной точкой. Максимально возможная величина составляет 30 разрядов, но не может быть больше, чем M -2.

      Квадратные скобки (‘ [ ’ и ‘ ] ’) указывают для типа данных группы необязательных признаков.

      Заметьте, что если для столбца указать параметр ZEROFILL , то MySQL будет автоматически добавлять в этот столбец атрибут UNSIGNED .

      Предупреждение: следует помнить, что при выполнении вычитания между числовыми величинами, одна из которых относится к типу UNSIGNED , результат будет беззнаковым! See Раздел 6.3.5, «Функции приведения типов».

      • TINYINT[(M)] [UNSIGNED] [ZEROFILL] Очень малое целое число. Диапазон со знаком от -128 до 127 . Диапазон без знака от 0 до 255 .
      • BIT , BOOL Являются синонимами для TINYINT(1) .
      • SMALLINT[(M)] [UNSIGNED] [ZEROFILL] Малое целое число. Диапазон со знаком от -32768 до 32767 . Диапазон без знака от 0 до 65535 .
      • MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] Целое число среднего размера. Диапазон со знаком от -8388608 до 8388607 . Диапазон без знака от 0 до 16777215 .
      • INT[(M)] [UNSIGNED] [ZEROFILL] Целое число нормального размера. Диапазон со знаком от -2147483648 до 2147483647 . Диапазон без знака от 0 до 4294967295 .
      • INTEGER[(M)] [UNSIGNED] [ZEROFILL] Синоним для INT .
      • BIGINT[(M)] [UNSIGNED] [ZEROFILL] Большое целое число. Диапазон со знаком от -9223372036854775808 до 9223372036854775807 . Диапазон без знака от 0 до 18446744073709551615 . Для столбцов типа BIGINT необходимо учитывать некоторые особенности:
      • Все арифметические операции выполняются с использованием значений BIGINT или DOUBLE со знаком, так что не следует использовать беззнаковые целые числа больше чем 9223372036854775807 (63 бита), кроме операций, выполняемых логическими функциями. В противном случае несколько последних разрядов результата могут оказаться ошибочными из-за ошибок округления при преобразовании BIGINT в DOUBLE . MySQL 4.0 может обрабатывать данные типа BIGINT в следующих случаях:
      • Использование целых чисел для хранения больших беззнаковых величин в столбце с типом BIGINT .
      • В случаях MIN(big_int_column) и MAX(big_int_column) .
      • При использовании операторов (‘ + ’, ‘ — ’, ‘ * ’ и т.д.), когда оба операнда являются целыми числами.

      6.2.1. Числовые типы данных

      MySQL поддерживает все числовые типы данных языка SQL92 по стандартам ANSI/ISO. Они включают в себя типы точных числовых данных ( NUMERIC , DECIMAL , INTEGER и SMALLINT ) и типы приближенных числовых данных ( FLOAT , REAL и DOUBLE PRECISION ). Ключевое слово INT является синонимом для INTEGER , а ключевое слово DEC — синонимом для DECIMAL .

      Типы данных NUMERIC и DECIMAL реализованы в MySQL как один и тот же тип — это разрешается стандартом SQL92. Они используются для величин, для которых важно сохранить повышенную точность, например для денежных данных. Требуемая точность данных и масштаб могут задаваться (и обычно задаются) при объявлении столбца данных одного из этих типов, например:

      salary DECIMAL(5,2)

      В этом примере — 5 (точность) представляет собой общее количество значащих десятичных знаков, с которыми будет храниться данная величина, а цифра 2 (масштаб) задает количество десятичных знаков после запятой. Следовательно, в этом случае интервал величин, которые могут храниться в столбце salary , составляет от -99,99 до 99,99 (в действительности для данного столбца MySQL обеспечивает возможность хранения чисел вплоть до 999,99 , поскольку можно не хранить знак для положительных чисел).

      В SQL92 по стандарту ANSI/ISO выражение DECIMAL(p) эквивалентно DECIMAL(p,0) . Аналогично, выражение DECIMAL также эквивалентно DECIMAL(p,0) , при этом предполагается, что величина p определяется конкретной реализацией. В настоящее время MySQL не поддерживает ни одну из рассматриваемых двух различных форм типов данных DECIMAL/NUMERIC . В общем случае это не является серьезной проблемой, так как основные преимущества данных типов состоят в возможности явно управлять как точностью, так и масштабом представления данных.

      Величины типов DECIMAL и NUMERIC хранятся как строки, а не как двоичные числа с плавающей точкой, чтобы сохранить точность представления этих величин в десятичном виде. При этом используется по одному символу строки для каждого разряда хранимой величины, для десятичного знака (если масштаб > 0 ) и для знака ‘ — ’ (для отрицательных чисел). Если параметр масштаба равен 0 , то величины DECIMAL и NUMERIC не содержат десятичного знака или дробной части.

      Максимальный интервал величин DECIMAL и NUMERIC тот же, что и для типа DOUBLE , но реальный интервал может быть ограничен выбором значений параметров точности или масштаба для данного столбца с типом данных DECIMAL или NUMERIC . Если конкретному столбцу присваивается значение, имеющее большее количество разрядов после десятичного знака, чем разрешено параметром масштаба , то данное значение округляется до количества разрядов, разрешенного масштаба . Если столбцу с типом DECIMAL или NUMERIC присваивается значение, выходящее за границы интервала, заданного значениями точности и масштаба (или принятого по умолчанию), то MySQL сохранит данную величину со значением соответствующей граничной точки данного интервала.

      В качестве расширения стандарта ANSI/ISO SQL92 MySQL также поддерживает числовые типы представления данных TINYINT , MEDIUMINT и BIGINT , кратко описанные в таблице выше. Еще одно расширение указанного стандарта, поддерживаемое MySQL, позволяет при необходимости указывать количество показываемых пользователю символов целого числа в круглых скобках, следующих за базовым ключевым словом данного типа (например INT(4) ). Это необязательное указание количества выводимых символов используется для дополнения слева выводимых значений, которые содержат символов меньше, чем заданная ширина столбца, однако не накладывает ограничений ни на диапазон величин, которые могут храниться в столбце, ни на количество разрядов, которые могут выводиться для величин, у которых количество символов превосходит ширину данного столбца. Если дополнительно указан необязательный атрибут ZEROFILL , свободные позиции по умолчанию заполняются нолями. Например, для столбца, объявленного как INT(5) ZEROFILL , величина 4 извлекается как 00004 . Следует учитывать, что если в столбце для целых чисел хранится величина с количеством символов, превышающим заданную ширину столбца, могут возникнуть проблемы, когда MySQL будет генерировать временные таблицы для некоторых сложных связей, так как в подобных случаях MySQL полагает, что данные действительно поместились в столбец имеющейся ширины.

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

      В версии MySQL 4.0.2 числовые типы данных с плавающей точкой также могут иметь параметр UNSIGNED . Как и в целочисленных типах, этот атрибут предотвращает хранение в отмеченном столбце отрицательных величин. Но, в отличие от целочисленных типов, максимальный интервал для величин столбца остается прежним.

      Тип FLOAT обычно используется для представления приблизительных числовых типов данных. Стандарт ANSI/ISO SQL92 допускает факультативное указание точности (но не интервала порядка числа) в битах в круглых скобках, следующих за ключевым словом FLOAT . Реализация MySQL также поддерживает это факультативное указание точности. При этом если ключевое слово FLOAT в обозначении типа столбца используется без указания точности, MySQL выделяет 4 байта для хранения величин в этом столбце. Возможно также иное обозначение, с двумя числами в круглых скобках за ключевым словом FLOAT . В этом варианте первое число по-прежнему определяет требования к хранению величины в байтах, а второе число указывает количество разрядов после десятичной запятой, которые будут храниться и показываться (как для типов DECIMAL и NUMERIC ). Если в столбец подобного типа попытаться записать число, содержащее больше десятичных знаков после запятой, чем указано для данного столбца, то значение величины при ее хранении в MySQL округляется для устранения излишних разрядов.

      Для типов REAL и DOUBLE PRECISION не предусмотрены установки точности. MySQL воспринимает DOUBLE как синоним типа DOUBLE PRECISION — это еще одно расширение стандарта ANSI/ISO SQL92. Но, вопреки требованию стандарта, указывающему, что точность для REAL меньше, чем для DOUBLE PRECISION , в MySQL оба типа реализуются как 8-байтовые числа с плавающей точкой удвоенной точности (если не установлен «ANSI-режим»). Чтобы обеспечить максимальную совместимость, в коде, требующем хранения приблизительных числовых величин, должны использоваться типы FLOAT или DOUBLE PRECISION без указаний точности или количества десятичных знаков.

      Если в числовой столбец попытаться записать величину, выходящую за границы допустимого интервала для столбца данного типа, то MySQL ограничит величину до соответствующей граничной точки данного интервала и сохранит результат вместо исходной величины.

      Например, интервал столбца INT составляет от -2147483648 до 2147483647 . Если попытаться записать в столбец INT число -9999999999 , то оно будет усечено до нижней конечной точки интервала и вместо записываемого значения в столбце будет храниться величина -2147483648 . Аналогично, если попытаться записать число 9999999999 , то взамен запишется число 2147483647 .

      Если для столбца INT указан параметр UNSIGNED , то величина допустимого интервала для столбца останется той же, но его граничные точки сдвинутся к 0 и 4294967295 . Если попытаться записать числа -9999999999 и 9999999999 , то в столбце окажутся величины 0 и 4294967296 .

      Для команд ALTER TABLE , LOAD DATA INFILE , UPDATE и многострочной INSERT выводится предупреждение, если могут возникнуть преобразования данных вследствие вышеописанных усечений.

      Тип Байт От До
      TINYINT 1 -128 127
      SMALLINT 2 -32768 32767
      MEDIUMINT 3 -8388608 8388607
      INT 4 -2147483648 2147483647
      BIGINT 8 -9223372036854775808 9223372036854775807

      6.2.2. Типы данных даты и времени

      Существуют следующие типы данных даты и времени: DATETIME , DATE , TIMESTAMP , TIME и YEAR . Каждый из них имеет интервал допустимых значений, а также значение «ноль», которое используется, когда пользователь вводит действительно недопустимое значение. Отметим, что MySQL позволяет хранить некоторые не вполне достоверные значения даты, например 1999-11-31 . Причина в том, что, по нашему мнению, управление проверкой даты входит в обязанности конкретного приложения, а не SQL-серверов. Для ускорения проверки правильности даты MySQL только проверяет, находится ли месяц в интервале 0-12 и день в интервале 0-31 . Данные интервалы начинаются с 0 , это сделано для того, чтобы обеспечить для MySQL возможность хранить в столбцах DATE или DATETIME даты, в которых день или месяц равен нулю. Эта возможность особенно полезна для приложений, которые предполагают хранение даты рождения — здесь не всегда известен день или месяц рождения. В таких случаях дата хранится просто в виде 1999-00-00 или 1999-01-00 (при этом не следует рассчитывать на то, что для подобных дат функции DATE_SUB() или DATE_ADD дадут правильные значения).

      Ниже приведены некоторые общие соображения, полезные при работе с типами данных даты и времени:

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

      • Хотя MySQL пытается интерпретировать значения в нескольких форматах, во всех случаях ожидается, что крайним слева будет раздел значения даты, содержащий год. Даты должны задаваться в порядке год-месяц-день (например, ’98-09-04′ ), а не в порядке месяц-день-год или день-месяц-год , т.е. не так, как мы их обычно записываем (например ’09-04-98′ , ’04-09-98′ ).
      • MySQL автоматически преобразует значение, имеющее тип даты или времени, в число, если данная величина используется в числовом контексте, и наоборот.
      • Значение, имеющее тип даты или времени, которое выходит за границы установленного интервала или является недопустимым для этого типа данных (см. начало раздела), преобразуется в значение «ноль» для данного типа. (Исключение составляют выходящие за границы установленного интервала величины типа TIME , которые усекаются до соответствующей граничной точки заданного интервала TIME ). В следующей таблице представлены форматы значения «ноль» для каждого из типов столбцов:

      Тип столбца Значение «Ноль»
      DATETIME ‘0000-00-00 00:00:00’
      DATE ‘0000-00-00’
      TIMESTAMP 00000000000000 (длина зависит от количества выводимых символов)
      TIME ’00:00:00′
      YEAR 0000
      6.2.2.1. Проблема 2000 года и типы данных

      Ядро MySQL само по себе устойчиво к «проблеме 2000 года» (see Раздел 1.4.5, «Вопросы, связанные с Проблемой-2000»), но некоторые представленные в MySQL входные величины могут являться источниками ошибок. Так, любое вводимое значение, содержащее двухразрядное значение года, является неоднозначным, поскольку неизвестно столетие. Подобные величины должны быть переведены в четырехразрядную форму, так как для внутреннего представления года в MySQL используется 4 разряда.

      Для типов DATETIME , DATE , TIMESTAMP и YEAR даты с неоднозначным годом интерпретируются в MySQL по следующим правилам:

      • Величина года в интервале 00-69 конвертируется в 2000-2069 .
      • Величина года в интервале 70-99 конвертируется в 1970-1999 .

      Следует помнить, что эти правила дают только правдоподобные предположения о том, что ваши данные в действительности означают. Если применяемая MySQL эвристика не дает правильных величин, необходимо обеспечить недвусмысленные входные данные, содержащие четырехразрядные величины года.

      ORDER BY отсортирует двухразрядные YEAR/DATE/DATETIME типы корректно.

      Необходимо также отметить, что некоторые функции, такие как MIN() и MAX() будут преобразовывать TIMESTAMP/DATE в число. Это означает, что столбец с данными типа TIMESTAMP , содержащими год в виде двух разрядов, не будет правильно работать с указанными функциями. Выход из этого положения состоит в преобразовании TIMESTAMP/DATE к четырехразрядному формату или использовании чего-нибудь вроде MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)) .

      6.2.2.2. Типы данных DATETIME , DATE и TIMESTAMP

      Типы DATETIME , DATE и TIMESTAMP являются родственными типами данных. В данном разделе описаны их свойства, общие черты и различия.

      Тип данных DATETIME используется для величин, содержащих информацию как о дате, так и о времени. MySQL извлекает и выводит величины DATETIME в формате ‘YYYY-MM-DD HH:MM:SS’ . Поддерживается диапазон величин от ‘1000-01-01 00:00:00’ до ‘9999-12-31 23:59:59’ . (»поддерживается» означает, что хотя величины с более ранними временными значениями, возможно, тоже будут работать, но нет гарантии того, что они будут правильно храниться и отображаться).

      Тип DATE используется для величин с информацией только о дате, без части, содержащей время. MySQL извлекает и выводит величины DATE в формате ‘YYYY-MM-DD’ . Поддерживается диапазон величин от ‘1000-01-01’ до ‘9999-12-31’ .

      Тип столбца TIMESTAMP обеспечивает тип представления данных, который можно использовать для автоматической записи текущих даты и времени при выполнении операций INSERT или UPDATE . При наличии нескольких столбцов типа TIMESTAMP только первый из них обновляется автоматически.

      Автоматическое обновление первого столбца с типом TIMESTAMP происходит при выполнении любого из следующих условий:

      • Столбец не указан явно в команде INSERT или LOAD DATA INFILE .
      • Столбец не указан явно в команде UPDATE , и при этом изменяется величина в некотором другом столбце (следует отметить, что команда UPDATE , устанавливающая столбец в то же самое значение, которое было до выполнения команды, не вызовет обновления столбца TIMESTAMP , поскольку в целях повышения производительности MySQL игнорирует подобные обновления при установке столбца в его текущее значение).
      • Величина в столбце TIMESTAMP явно установлена в NULL .

      Для остальных (кроме первого) столбцов типа TIMESTAMP также можно задать установку в значение текущих даты и времени. Для этого необходимо просто установить столбец в NULL или в NOW() .

      Любой столбец типа TIMESTAMP (даже первый столбец данного типа) можно установить в значение, отличное от текущих даты и времени. Это делается путем явной установки его в желаемое значение. Данное свойство можно использовать, например, если необходимо установить столбец TIMESTAMP в значение текущих даты и времени при создании строки, а при последующем обновлении этой строки значение столбца не должно изменяться:

      • Пусть MySQL автоматически установит значение столбца с типом TIMESTAMP при создании данной строки. Столбец будет установлен в исходное состояние со значением текущих даты и времени.
      • При выполнении последующих обновлений других столбцов в данной строке необходимо явно установить столбец TIMESTAMP в его текущее значение.

      Однако, с другой стороны, для этих целей, возможно, будет проще использовать столбец DATETIME . При создании строки его следует инициализировать функцией NOW() и оставить в покое при последующих обновлениях.

      Величины типа TIMESTAMP могут принимать значения от начала 1970 года до некоторого значения в 2037 году с разрешением в одну секунду. Эти величины выводятся в виде числовых значений.

      Формат данных, в котором MySQL извлекает и показывает величины TIMESTAMP , зависит от количества показываемых символов. Это проиллюстрировано в приведенной ниже таблице. Полный формат TIMESTAMP составляет 14 десятичных разрядов, но можно создавать столбцы типа TIMESTAMP и с более короткой строкой вывода:

      Тип столбца Формат вывода
      TIMESTAMP(14) YYYYMMDDHHMMSS
      TIMESTAMP(12) YYMMDDHHMMSS
      TIMESTAMP(10) YYMMDDHHMM
      TIMESTAMP(8) YYYYMMDD
      TIMESTAMP(6) YYMMDD
      TIMESTAMP(4) YYMM
      TIMESTAMP(2) YY

      Независимо от размера выводимого значения размер данных, хранящихся в столбцах типа TIMESTAMP , всегда один и тот же. Чаще всего используется формат вывода с 6, 8, 12 или 14 десятичными знаками. При создании таблицы можно указать произвольный размер выводимых значений, однако если этот размер задать равным 0 или превышающим 14, то будет использоваться значение 14. Нечетные значения размеров в интервале от 1 до 13 будут приведены к ближайшему большему четному числу.

      Величины DATETIME , DATE и TIMESTAMP могут быть заданы любым стандартным набором форматов:

      • Как строка в формате ‘YYYY-MM-DD HH:MM:SS’ или в формате ‘YY-MM-DD HH:MM:SS’ . Допускается «облегченный» синтаксис — можно использовать любой знак пунктуации в качестве разделительного между частями разделов даты или времени. Например, величины ’98-12-31 11:30:45′ , ‘98.12.31 11+30+45′ , ’98/12/31 11*30*45′ и ’98@12@31 11^30^45’ являются эквивалентными.
      • Как строка в формате ‘YYYY-MM-DD’ или в формате ‘YY-MM-DD’ . Здесь также допустим «облегченный» синтаксис. Например, величины ’98-12-31′ , ‘98.12.31’ , ’98/12/31′ и ’98@12@31′ являются эквивалентными.
      • Как строка без разделительных знаков в формате ‘YYYYMMDDHHMMSS’ или в формате ‘YYMMDDHHMMSS’ , при условии, что строка понимается как дата. Например, величины ‘19970523091528’ и ‘970523091528’ можно интерпретировать как ‘1997-05-23 09:15:28’ , но величина ‘971122129015’ является недопустимой (значение раздела минут является абсурдным) и преобразуется в ‘0000-00-00 00:00:00’ .
      • Как строка без разделительных знаков в формате ‘YYYYMMDD’ или в формате ‘YYMMDD’ , при условии, что строка интерпретируется как дата. Например, величины ‘19970523’ и ‘970523’ можно интерпретировать как ‘1997-05-23’ , но величина ‘971332’ является недопустимой (значения разделов месяца и дня не имеют смысла) и преобразуется в ‘0000-00-00’ .
      • Как число в формате YYYYMMDDHHMMSS или в формате YYMMDDHHMMSS , при условии, что число интерпретируется как дата. Например, величины 19830905132800 и 830905132800 интерпретируются как ‘1983-09-05 13:28:00’ .
      • Как число в формате YYYYMMDD или в формате YYMMDD , при условии, что число интерпретируется как дата. Например, величины 19830905 и 830905 интерпретируются как ‘1983-09-05’ .
      • Как результат выполнения функции, возвращающей величину, приемлемую в контекстах типов данных DATETIME , DATE или TIMESTAMP (например, функции NOW() или CURRENT_DATE() .

      Недопустимые значения величин DATETIME , DATE или TIMESTAMP преобразуются в значение «ноль» соответствующего типа величин ( ‘0000-00-00 00:00:00’ , ‘0000-00-00’ , или 00000000000000 ).

      Для величин, представленных как строки, содержащие разделительные знаки между частями даты, нет необходимости указывать два разряда для значений месяца или дня, меньших, чем 10 . Так, величина ‘1979-6-9’ эквивалентна величине ‘1979-06-09’ . Аналогично, для величин, представленных как строки, содержащие разделительные знаки внутри обозначения времени, нет необходимости указывать два разряда для значений часов, минут или секунд, меньших, чем 10 . Так,

      Величины, определенные как числа, должны иметь 6 , 8 , 12 , или 14 десятичных разрядов. Предполагается, что число, имеющее 8 или 14 разрядов, представлено в форматах YYYYMMDD или YYYYMMDDHHMMSS соответственно, причем год указан в первых четырех разрядах. Если же длина числа 6 или 12 разрядов, то предполагаются соответственно форматы YYMMDD или YYMMDDHHMMSS , где год указан в первых двух разрядах. Числа, длина которых не соответствует ни одному из описанных вариантов, интерпретируются как дополненные спереди нулями до ближайшей вышеуказанной длины.

      Величины, представленные строками без разделительных знаков, интерпретируются с учетом их длины согласно приведенным далее правилам. Если длина строки равна 8 или 14 символам, то предполагается, что год задан первыми четырьмя символами. В противном случае предполагается, что год задан двумя первыми символами. Строка интерпретируется слева направо, при этом определяются значения для года, месяца, дня, часов, минут и секунд для всех представленных в строке разделов. Это означает, что строка с длиной меньше, чем 6 символов, не может быть использована. Например, если задать строку вида ‘9903’ , полагая, что это будет означать март 1999 года, то MySQL внесет в таблицу «нулевую» дату. Год и месяц в данной записи равны 99 и 03 соответственно, но раздел, представляющий день, пропущен (значение равно нулю), поэтому в целом данная величина не является достоверным значением даты.

      При хранении допустимых величин в столбцах типа TIMESTAMP используется полная точность, указанная при их задании, независимо от количества выводимых символов. Это свойство имеет несколько следствий:

      • Необходимо всегда указывать год, месяц и день даже для типов TIMESTAMP(4) или TIMESTAMP(2) . В противном случае задаваемая величина не будет допустимым значением даты и будет храниться как 0 .
      • При увеличении ширины узкого столбца TIMESTAMP путем использования команды ALTER TABLE будет выводиться ранее «скрытая» информация.
      • И аналогично, при сужении столбца TIMESTAMP хранимая информация не будет потеряна, если не принимать во внимание, что при выводе информации будет выдаваться меньше.
      • Хотя величины TIMESTAMP хранятся с полной точностью, непосредственно может работать с этим исходным хранимым значением величины только функция UNIX_TIMESTAMP() . Остальные функции оперируют форматированными значениями извлеченной величины. Это означает, что нельзя использовать такие функции, как HOUR() или SECOND() , пока соответствующая часть величины TIMESTAMP не будет включена в ее форматированное значение. Например, раздел HH столбца TIMESTAMP не будет выводиться, пока количество выводимых символов не станет по меньшей мере равным 10 , так что попытки использовать HOUR() для более коротких величин TIMESTAMP приведут к бессмысленным результатам.

      Величины одного типа даты можно в ряде случаев присвоить объекту другого типа даты. Однако при этом возможны некоторое изменение величины или потеря информации:

      • Если присвоить значение типа DATE объекту DATETIME или TIMESTAMP , то в результирующей величине «временная» часть будет установлена в ’00:00:00′ , так как величина DATE не содержит информации о времени.
      • Если присвоить значение типа DATE , DATETIME или TIMESTAMP объекту DATE , то «временная» часть в результирующей величине будет удалена, так как тип DATE не включает информацию о времени.
      • Несмотря на то что все величины DATETIME , DATE и TIMESTAMP могут быть указаны с использованием одного и того же набора форматов, следует помнить, что указанные типы имеют разные интервалы допустимых значений. Например, величины типа TIMESTAMP не могут иметь значения даты более ранние, чем относящиеся к 1970 году или более поздние, чем относящиеся к 2037 году. Это означает, что такая дата, как ‘1968-01-01’ , будучи разрешенной для величины типа DATETIME или DATE , недопустима для величины типа TIMESTAMP и будет преобразована в 0 при присвоении этому объекту.

      Задавая величины даты, следует иметь в виду некоторые «подводные камни»:

      • Упрощенный формат, который допускается для величин, заданных строками, может ввести в заблуждение. Например, такая величина, как ’10:11:12′ , благодаря разделителю ‘ : ’ могла бы оказаться величиной времени, но, используемая в контексте даты, она будет интерпретирована как год ‘2010-11-12′ . В то же время величина ’10:45:15’ будет преобразована в ‘0000-00-00′ , так как для месяца значение ’45’ недопустимо.
      • Сервер MySQL выполняет только первичную проверку истинности даты: дни 00-31 , месяцы 00-12 , года 1000-9999 . Любая дата вне этого диапазона преобразуется в 0000-00-00 . Следует отметить, что, тем не менее, при этом не запрещается хранить неверные даты, такие как 2002-04-31 . Это позволяет веб-приложениям сохранять данные форм без дополнительной проверки. Чтобы убедиться в достоверности даты, выполняется проверка в самом приложении.
      • Величины года, представленные двумя разрядами, допускают неоднозначное толкование, так как неизвестно столетие. MySQL интерпретирует двухразрядные величины года по следующим правилам:
      • Величины года в интервале 00-69 преобразуются в 2000-2069 .
      • Величины года в интервале 70-99 преобразуются в 1970-1999 .
      6.2.2.3. Тип данных TIME

      MySQL извлекает и выводит величины типа TIME в формате ‘HH:MM:SS’ (или в формате ‘HHH:MM:SS’ для больших значений часов). Величины TIME могут изменяться в пределах от ‘-838:59:59’ до ‘838:59:59’ . Причина того, что «часовая» часть величины может быть настолько большой, заключается в том, что тип TIME может использоваться не только для представления времени дня (которое должно быть меньше 24 часов), но также для представления общего истекшего времени или временного интервала между двумя событиями (который может быть значительно больше 24 часов или даже отрицательным).

      Величины TIME могут быть заданы в различных форматах:

      Как строка в формате ‘D HH:MM:SS.дробная часть’ (следует учитывать, что MySQL пока не обеспечивает хранения дробной части величины в столбце рассматриваемого типа). Можно также использовать одно из следующих «облегченных» представлений: HH:MM:SS.дробная часть , HH:MM:SS , HH:MM , D HH:MM:SS , D HH:MM , D HH или SS . Здесь D — это дни из интервала значений 0-33 .

      • Как строка без разделителей в формате ‘HHMMSS’ , при условии, что строка интерпретируется как дата. Например, величина ‘101112’ понимается как ’10:11:12′ , но величина ‘109712’ будет недопустимой (значение раздела минут является абсурдным) и преобразуется в ’00:00:00′ .
      • Как число в формате HHMMSS , при условии, что строка интерпретируется как дата. Например, величина 101112 понимается как ’10:11:12′ . MySQL понимает и следующие альтернативные форматы: SS , MMSS , HHMMSS , HHMMSS.дробная часть . При этом следует учитывать, что хранения дробной части MySQL пока не обеспечивает.
      • Как результат выполнения функции, возвращающей величину, приемлемую в контексте типа данных типа TIME (например, такой функции, как CURRENT_TIME ).

      Для величин типа TIME , представленных как строки, содержащие разделительные знаки между частями значения времени, нет необходимости указывать два разряда для значений часов, минут или секунд, меньших 10 . Так, величина ‘8:3:2′ эквивалентна величине ’08:03:02’ .

      Будьте внимательны в отношении использования «укороченных» величин TIME в столбце типа TIME . MySQL интерпретирует выражения без разделительных двоеточий исходя из предположения, что крайние справа разряды представляют секунды (MySQL интерпретирует величины TIME как общее истекшее время, а не как время дня). Например, можно подразумевать, что величины ‘1112’ и 1112 обозначают ’11:12:00′ (11 часов и 12 минут дня по показаниям часов), но MySQL понимает их как ’00:11:12′ (11 минут, 12 секунд). Подобно этому, ’12’ и 12 интерпретируются как ’00:00:12′ . Величины TIME с разделительными двоеточиями, наоборот, всегда трактуются как время дня. Т.е. выражение ’11:12′ будет пониматься как ’11:12:00′ , а не ’00:11:12′ .

      Величины, лежащие вне разрешенного интервала TIME , но во всем остальном представляющие собой допустимые значения, усекаются до соответствующей граничной точки данного интервала. Например, величины ‘-850:00:00’ и ‘850:00:00’ преобразуются соответственно в ‘-838:59:59’ и ‘838:59:59’ .

      Недопустимые значения величин TIME преобразуются в значение ’00:00:00′ . Отметим, что поскольку выражение ’00:00:00′ само по себе представляет разрешенное значение величины TIME , то по хранящейся в таблице величине ’00:00:00′ невозможно определить, была ли эта величина изначально задана как ’00:00:00′ или является преобразованным значением недопустимой величины.

      6.2.2.4. Тип данных YEAR

      Тип YEAR — это однобайтный тип данных для представления значений года.

      MySQL извлекает и выводит величины YEAR в формате YYYY . Диапазон возможных значений — от 1901 до 2155 .

      Величины типа YEAR могут быть заданы в различных форматах:

      • Как четырехзначная строка в интервале значений от ‘1901’ до ‘2155’ .
      • Как четырехзначное число в интервале значений от 1901 до 2155 .
      • Как двухзначная строка в интервале значений от ’00’ до ’99’ . Величины в интервалах от ’00’ до ’69’ и от ’70’ до ’99’ при этом преобразуются в величины YEAR в интервалах от 2000 до 2069 и от 1970 до 1999 соответственно.
      • Как двухзначное число в интервале значений от 1 до 99 . Величины в интервалах от 1 до 69 и от 70 до 99 при этом преобразуются в величины YEAR в интервалах от 2001 до 2069 и от 1970 до 1999 соответственно. Необходимо принять во внимание, что интервалы для двухзначных чисел и двухзначных строк несколько различаются, так как нельзя указать «ноль» непосредственно как число и интерпретировать его как 2000 . Необходимо задать его как строку ‘0’ или ’00’ , или же оно будет интерпретировано как 0000 .
      • Как результат выполнения функции, возвращающей величину, приемлемую в контексте типа данных YEAR (такой как NOW() ).

      Недопустимые величины YEAR преобразуются в 0000 .

      6.2.3. Символьные типы данных

      Существуют следующие символьные типы данных: CHAR , VARCHAR , BLOB , TEXT , ENUM и SET . В данном разделе дается описание их работы, требований к их хранению и использования их в запросах.

      Тип Макс.размер Байт
      TINYTEXT или TINYBLOB 2^8-1 255
      TEXT или BLOB 2^16-1 (64K-1) 65535
      MEDIUMTEXT или MEDIUMBLOB 2^24-1 (16M-1) 16777215
      LONGBLOB 2^32-1 (4G-1) 4294967295
      6.2.3.1. Типы данных CHAR и VARCHAR

      Типы данных CHAR и VARCHAR очень схожи между собой, но различаются по способам их хранения и извлечения.

      В столбце типа CHAR длина поля постоянна и задается при создании таблицы. Эта длина может принимать любое значение между 1 и 255 (что же касается версии MySQL 3.23, то в ней длина столбца CHAR может быть от 0 до 255 ). Величины типа CHAR при хранении дополняются справа пробелами до заданной длины. Эти концевые пробелы удаляются при извлечении хранимых величин.

      Величины в столбцах VARCHAR представляют собой строки переменной длины. Так же как и для столбцов CHAR , можно задать столбец VARCHAR любой длины между 1 и 255 . Однако, в противоположность CHAR , при хранении величин типа VARCHAR используется только то количество символов, которое необходимо, плюс один байт для записи длины. Хранимые величины пробелами не дополняются, наоборот, концевые пробелы при хранении удаляются (описанный процесс удаления пробелов отличается от предусмотренного спецификацией ANSI SQL).

      Если задаваемая в столбце CHAR или VARCHAR величина превосходит максимально допустимую длину столбца, то эта величина соответствующим образом усекается.

      Различие между этими двумя типами столбцов в представлении результата хранения величин с разной длиной строки в столбцах CHAR(4) и VARCHAR(4) проиллюстрировано следующей таблицей:

      Величина CHAR(4) Требуемая память VARCHAR(4) Требуемая память
      » ‘ ‘ 4 байта » 1 байт
      ‘ab’ ‘ab ‘ 4 байта ‘ab’ 3 байта
      ‘abcd’ ‘abcd’ 4 байта ‘abcd’ 5 байтов
      ‘abcdefgh’ ‘abcd’ 4 байта ‘abcd’ 5 байтов

      Извлеченные из столбцов CHAR(4) и VARCHAR(4) величины в каждом случае будут одними и теми же, поскольку при извлечении концевые пробелы из столбца CHAR удаляются.

      Если при создании таблицы не был задан атрибут BINARY для столбцов, то величины в столбцах типа CHAR и VARCHAR сортируются и сравниваются без учета регистра. При задании атрибута BINARY величины в столбце сортируются и сравниваются с учетом регистра в соответствии с порядком таблицы ASCII на том компьютере, где работает сервер MySQL. Атрибут BINARY не влияет на процессы хранения или извлечения данных из столбца.

      Атрибут BINARY является «прилипчивым». Это значит, что, если в каком-либо выражении использовать столбец, помеченный как BINARY , то сравнение всего выражения будет выполняться как сравнение величины типа BINARY .

      MySQL может без предупреждения изменить тип столбца CHAR или VARCHAR во время создания таблицы. See Раздел 6.5.3.1, «Молчаливые изменения определений столбцов».

      6.2.3.2. Типы данных BLOB и TEXT

      Тип данных BLOB представляет собой двоичный объект большого размера, который может содержать переменное количество данных. Существуют 4 модификации этого типа — TINYBLOB , BLOB , MEDIUMBLOB и LONGBLOB , отличающиеся только максимальной длиной хранимых величин. See Раздел 6.2.6, «Требования к памяти для различных типов столбцов».

      Тип данных TEXT также имеет 4 модификации — TINYTEXT , TEXT , MEDIUMTEXT и LONGTEXT , соответствующие упомянутым четырем типам BLOB и имеющие те же максимальную длину и требования к объему памяти. Единственное различие между типами BLOB и TEXT состоит в том, что сортировка и сравнение данных выполняются с учетом регистра для величин BLOB и без учета регистра для величин TEXT . Другими словами, TEXT — это независимый от регистра BLOB .

      Если размер задаваемого в столбце BLOB или TEXT значения превосходит максимально допустимую длину столбца, то это значение соответствующим образом усекается.

      В большинстве случаев столбец TEXT может рассматриваться как столбец VARCHAR неограниченного размера. И, аналогично, BLOB — как столбец типа VARCHAR BINARY . Различия при этом следующие:

      • Столбцы типов BLOB и TEXT могут индексироваться в версии MySQL 3.23.2 и более новых. Более старые версии MySQL не поддерживают индексацию этих столбцов.
      • В столбцах типов BLOB и TEXT не производится удаление концевых символов, как это делается для столбцов типа VARCHAR .
      • Для столбцов BLOB и TEXT не может быть задан атрибут DEFAULT — значения величин по умолчанию.

      В MyODBC величины типа BLOB определяются как LONGVARBINARY и величины типа TEXT — как LONGVARCHAR .

      Так как величины типов BLOB и TEXT могут быть чрезмерно большими, при их использовании целесообразно предусмотреть некоторые ограничения:

      Чтобы обеспечить возможность использования команд GROUP BY или ORDER BY в столбце типа BLOB или TEXT , необходимо преобразовать значение столбца в объект с фиксированной длиной. Обычно это делается с помощью функции SUBSTRING . Например:

      mysql> SELECT comment FROM tbl_name,SUBSTRING(comment,20) AS substr -> ORDER BY substr; 

      Если этого не сделать, то операция сортировки в столбце будет выполнена только для первых байтов, количество которых задается параметром max_sort_length . Значение по умолчанию величины max_sort_length равно 1024 ; это значение можно изменить, используя параметр -O сервера mysqld при его запуске. Группировка выражения, включающего в себя величины BLOB или TEXT , возможна при указании позиции столбца или использовании псевдонима:

      mysql> SELECT id,SUBSTRING(blob_col,1,100) FROM tbl_name GROUP BY 2; mysql> SELECT id,SUBSTRING(blob_col,1,100) AS b FROM tbl_name GROUP BY b; 
      • Максимальный размер объекта типа BLOB или TEXT определяется его типом, но наибольшее значение, которое фактически может быть передано между клиентом и сервером, ограничено величиной доступной памяти и размером буферов связи. Можно изменить размер буфера блока передачи, но сделать это необходимо как на стороне сервера, так и на стороне клиента. See Раздел 5.5.2, «Настройка параметров сервера».

      Следует учитывать, что внутренним представлением любой величины типа BLOB или TEXT является отдельно размещенный объект — в противоположность всем остальным типам столбцов, для которых память выделяется единовременно для столбца при открытии таблицы.

      6.2.3.3. Тип перечисления ENUM

      ENUM (перечисление) — это столбец, который может принимать значение из списка допустимых значений, явно перечисленных в спецификации столбца в момент создания таблицы.

      Этим значением также может быть пустая строка («») или NULL при определенных условиях:

      • Если делается всавка некорректного значения в столбец ENUM (т.е. вставка строки, не перечисленной в списке допустимых), то вставляется пустая строка, что является указанием на ошибочное значение. Эта строка отличается от «обычной» пустой строки по тому признаку, что она имеет цифровое значение, равное 0. Об этом чуть ниже.
      • Если ENUM определяется как NULL, то тогда NULL тоже является допустимым значением столбца и значение по умолчанию — NULL. Если ENUM определяется как NOT NULL, то значением по умолчанию является первый элемент из списка допустимых значений.

      Каждая величина из допустимы имеет индекс:

      • Значение из списка допустимых величин, определенных при создании таблицы нумеруются, начиная с 1.
      • Индекс пустой ошибочной строки — 0. Это означает что вы можете использовать следующий SELECT для того, чтобы найти записи, в которые были вставлены некорректные значения ENUM:
      mysql> SELECT * FROM tbl_name WHERE enum_col=0; 

      Например, столбец, определенный как ENUM(«один», «два», «три») может иметь любую из перечисленных величин. Индекс каждой величины также известен:

      Величина Индекс
      NULL NULL
      «» 0
      «один» 1
      «два» 2
      «три» 3

      Перечисление может иметь максимум 65535 элементов.

      Начиная с 3.23.51, оконечные пробелы автоматически удаляются из величин этого столбца в момент создания таблицы.

      Регистр не играет роли, когда вы делаете вставку в столбец ENUM. Однако регистр значений, получаемых из этого столбца, совпадает с регистром в написании соответствующего значения, заданного во время создания таблицы.

      Если вы делаете выборку столбца ENUM в числовом контексте, возвращается индекс значения. Например, вы можете получить численное значение ENUM таким образом:

      mysql> SELECT enum_col+0 FROM tbl_name; 

      Если вы вставляете число в столбец ENUM, это число воспринимается как индекс, и в таблицу записывается соответствующее этому индексу значение перечисления. (Однако, это не будет работать с LOAD DATA, который воспринимает все входящие данные как строки.) Не рекомендуется сохранять числа в перечислении, т.к. это может привести к излишней путаннице.

      Значения перечисления сортируются в соответствии с порядком, в котором допустимые значения были заданы при создании таблицы. (Другими словами, значения ENUM сортируются в соответствии с ихними индексами.) Например, «a» в отсортированном выводе будет присутствовать раньше чем «b» для ENUM(«a», «b») , но «b» появится раньше «a» для ENUM(«b»,»a») . Пустые строки возвращаются перед непустыми строками, и NULL-значения будут выведены в самую первую очередь.

      Для предотвращения неожиданностей, указывайте список ENUM в алфавитном порядке. Вы также можете использовать GROUP BY CONCAT(col) чтобы удостовериться, что столбец отсортирован в алфавитном порядке, а не по индексу.

      Если вам нужно получить список возможных значения для столбца ENUM, вы должны вызвать SHOW COLUMNS FROM имя_таблицы LIKE имя_столбца_enum и проанализировать определение ENUM во втором столбце.

      6.2.3.4. Тип множества SET

      SET — это строковый тип, который может принимать ноль или более значений, каждое из которых должно быть выбрано из списка допустимых значений, определенных при создании таблицы. Элементы множества SET разделяются запятыми. Как следствие, сами элементы множества не могут содержать запятых.

      Например, столбец, определенный как SET(«один», «два») NOT NULL может принимать такие значения:

      "" "один" "два" "один,два"

      Множество SET может иметь максимум 64 различных элемента.

      Начиная с 3.23.51, оконечные пробелы удаляются из значений множества SET в момент создания таблицы.

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

      mysql> SELECT set_col+0 FROM tbl_name; 

      Если делается вставка в столбец SET, биты, установленные в двоичном представлении числа определяют элементы множества. Допустим, столбец определен как SET(«a»,»b»,»c»,»d») . Тогда элементы имеют такие биты установленными:

      SET элемент числовое значение двоичное значение
      a 1 0001
      b 2 0010
      c 4 0100
      d 8 1000

      Если вы вставляет значение 9 в этот столбец, это соответствует 1001 в двоичном представлении, так что первый ( «a» ) и четвертый ( «d» ) элементы множества выбираются, что в результате дает «a,d» .

      Для значения, содержащего более чем один элемент множестве, не играет никакой роли, в каком порядке эти элементы перечисляются в момент вставки значения. Также не играет роли, как много раз то или иное значение перечислено. Когда позже это значение выбирается, каждый элемент будет присутствовать только единожды, и элементы будут перечислены в том порядке, в котором они перечисляются в определении таблицы. Например, если столбец определен как SET(«a»,»b»,»c»,»d») , тогда «a,d» , «d,a» , и «d,a,a,d,d» будут представлены как «a,d» .

      Если вы вставляете в столбец SET некорректую величины, это значение будет проигнорировано.

      SET-значения сортируются в соответствии с числовым представлением. NULL-значения идут в первую очередь.

      Обычно, следует выполнять SELECT для SET-столбца, используя оператор LIKE или функцию FIND_IN_SET() :

      mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%'; mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0; 

      Но и такая форма также работает:

      mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2'; mysql> SELECT * FROM tbl_name WHERE set_col & 1; 

      Первый оператор в каждом примере делает выборку точного значения. Второй оператор делает выборку значений, содержащих первого элемента множества.

      Если вам нужно получить все возможные значения для столбца SET, вам следует вызвать SHOW COLUMNS FROM table_name LIKE set_column_name и проанализировать SET-определение во втором столбце.

      6.2.4. Выбор правильного типа данных в столбце

      Для того чтобы память использовалась наиболее эффективно, всегда следует стараться применять тип данных, обеспечивающий максимальную точность. Например, для величин в диапазоне между 1 и 99999 в целочисленном столбце наилучшим типом будет MEDIUMINT UNSIGNED .

      Часто приходится сталкиваться с такой проблемой, как точное представление денежных величин. В MySQL для представления таких величин необходимо использовать тип данных DECIMAL . Поскольку данные этого типа хранятся в виде строки, потерь в точности не происходит. А в случаях, когда точность не имеет слишком большого значения, вполне подойдет и тип данных DOUBLE .

      Если же требуется высокая точность, всегда можно выполнить конвертирование в тип данных с фиксированной точкой. Такие данные хранятся в виде BIGINT . Это позволяет выполнять все вычисления с ними как с целыми числами, а впоследствии при необходимости результаты можно преобразовать обратно в величины с плавающей точкой.

      6.2.5. Использование типов столбцов из других баз данных

      Чтобы облегчить использование SQL-кода, написанного для баз данных других поставщиков, в MySQL установлено соответствие типов столбцов, как показано в следующей таблице. Это соответствие упрощает применение описаний таблиц баз данных других поставщиков в MySQL:

      Тип иного поставщика Тип MySQL
      BINARY(NUM) CHAR(NUM) BINARY
      CHAR VARYING(NUM) VARCHAR(NUM)
      FLOAT4 FLOAT
      FLOAT8 DOUBLE
      INT1 TINYINT
      INT2 SMALLINT
      INT3 MEDIUMINT
      INT4 INT
      INT8 BIGINT
      LONG VARBINARY MEDIUMBLOB
      LONG VARCHAR MEDIUMTEXT
      MIDDLEINT MEDIUMINT
      VARBINARY(NUM) VARCHAR(NUM) BINARY

      Соотнесение типов столбцов происходит во время создания таблицы. При создании таблицы с типами столбцов, которые используются другими поставщиками, после запуска команды DESCRIBE имя_таблицы выдается структура данной таблицы с применением принятых в MySQL эквивалентных типов.

      6.2.6. Требования к памяти для различных типов столбцов

      Требования к объему памяти для столбцов каждого типа, поддерживаемого MySQL, перечислены ниже по категориям.

      Требования к памяти для числовых типов

      Тип столбца Требуемая память
      TINYINT 1 byte
      SMALLINT 2 байта
      MEDIUMINT 3 байта
      INT 4 байта
      INTEGER 4 байта
      BIGINT 8 байтов
      FLOAT(X) 4, если X
      FLOAT 4 байта
      DOUBLE 8 байтов
      DOUBLE PRECISION 8 байтов
      REAL 8 байтов
      DECIMAL(M,D) M+2 байт, если D > 0, M+1 байт, если D = 0 ( D +2, если M < D )
      NUMERIC(M,D) M+2 байт, если D > 0, M+1 байт, если D = 0 ( D +2, если M < D )

      Требования к памяти для типов даты и времени

      Тип столбца Требуемая память
      DATE 3 байта
      DATETIME 8 байтов
      TIMESTAMP 4 байта
      TIME 3 байта
      YEAR 1 байт

      Требования к памяти для символьных типов

      Тип столбца Требуемая память
      CHAR(M) M байт, 1
      VARCHAR(M) L +1 байт, где L <= M и 1
      TINYBLOB , TINYTEXT L +1 байт, где L < 2^8
      BLOB , TEXT L +2 байт, где L < 2^16
      MEDIUMBLOB , MEDIUMTEXT L +3 байт, где L < 2^24
      LONGBLOB , LONGTEXT L +4 байт, где L < 2^32
      ENUM(‘value1′,’value2’. ) 1 или 2 байт, в зависимости от количества перечисляемых величин (максимум 65535)
      SET(‘value1′,’value2’. ) 1, 2, 3, 4 или 8 байт, в зависимости от количества элементов множества (максимум 64)

      VARCHAR , BLOB и TEXT являются типами данных с переменной длиной строки, для таких типов требования к памяти в общем случае определяются реальным размером величин в столбце (представлен символом L в приведенной выше таблице), а не максимально возможным для данного типа размером. Например, столбец VARCHAR(10) может содержать строку с максимальной длиной 10 символов. Реально требуемый объем памяти равен длине строки ( L ) плюс 1 байт для записи длины строки. Для строки ‘abcd’ L равно 4 и требуемый объем памяти равен 5 байтов.

      В случае типов данных BLOB и TEXT требуется 1, 2, 3 или 4 байта для записи длины значения данного столбца в зависимости от максимально возможной длины для данного типа. See Раздел 6.2.3.2, «Типы данных BLOB и TEXT ».

      Если таблица включает в себя столбец какого-либо типа с переменной длиной строки, то формат записи также будет переменной длины. Следует учитывать, что при создании таблицы MySQL может при определенных условиях преобразовать тип столбца с переменной длиной в тип с постоянной длиной строки или наоборот. See Раздел 6.5.3.1, «Молчаливые изменения определений столбцов».

      Размер объекта ENUM определяется количеством различных перечисляемых величин. Один байт используется для перечисления до 255 возможных величин. Используя два байта, можно перечислить до 65535 величин. See Раздел 6.2.3.3, «Тип перечисления ENUM ».

      Размер объекта SET определяется количеством различных элементов множества. Если это количество равно N , то размер объекта вычисляется по формуле (N+7)/8 и полученное число округляется до 1 , 2 , 3 , 4 или 8 байтов. Множество SET может иметь максимум 64 элемента. See Раздел 6.2.3.4, «Тип множества SET ».

      Максимальный размер записи в MyISAM составляет 65534 байтов. Каждый BLOB или TEXT -столбец засчитывается здесь как 5-9 байтов.

      6.3. Функции, используемые в операторах SELECT и WHERE

      В команде SQL выражение SELECT или определение WHERE могут включать в себя любое выражение, в котором используются описанные ниже функции.

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

      Примечание: между именем функции и следующими за ним скобками не должно быть пробелов. Это поможет синтаксическому анализатору MySQL отличать вызовы функций от ссылок на таблицы или столбцы, имена которых случайно окажутся теми же, что и у функций. Однако допускаются пробелы до или после аргументов.

      Если нужно, чтобы в MySQL допускались пробелы после имени функции, следует запустить mysqld с параметром —ansi или использовать CLIENT_IGNORE_SPACE в mysql_connect() , но в этом случае все имена функций станут зарезервированными словами. See Раздел 1.9.2, «Запуск MySQL в режиме ANSI».

      В целях упрощения в данной документации результат выполнения программы mysql в примерах представлен в сокращенной форме. Таким образом вывод:

      mysql> SELECT MOD(29,9); 1 rows in set (0.00 sec) +-----------+ | mod(29,9) | +-----------+ | 2 | +-----------+

      будет представлен следующим образом:

      mysql> SELECT MOD(29,9); -> 2
  • Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *