Xpoint
   [напомнить пароль]

Компьютеры::Базы данных (СУБД)::СУБД MySQL - F.A.Q.

Где взять русскую документацию по MySQL?
  1. С официального сайта
  2. На сайте проекта RussianLDP:MySQL
Как установить кодировку MySQL для WinNT?
Для поддержки в Mysql cp1251 нужно выставить default-character-set=cp1251 Более подробный ответ вы сможете найти на http://www.mysql.com/doc/O/p/Option_files.html и http://www.mysql.com/doc/C/h/Character_sets.html.
Конфигурация MySQL "по умолчанию"
При запуске MySQL "читает" настройки из файла конфигурации.

Под UNIX это, могут быть файлы:
/etc/my.cnf
DATADIR/my.cnf
defaults-extra-file
~/.my.cnf
*) DATADIR - директория данных MySQL (обычно это /usr/local/mysql/data при установке из бинарников или /usr/local/var при установке из исходников).

под Windows (начиная с версии 3.22):

windows-system-directory\my.ini
C:\my.cnf

В этом файле, в том числе, прописывается пользователь root

ВНИМАНИЕ!

  1. по умолчанию пароль для root НЕ установлен! УСТАНОВИТЕ ЕГО:
    ...user=root
    password=ваш_новый_пароль
    
  2. так как под Windows отсутствует механизм регулирования того откуда и куда можно устанавливать соединения ваш MySQL оказывается открыт всему миру!

    Эту ситуацию следует изменить (через установку и настройку firewall, встроенным фильтратором пакетов на сетевой карте или иным способом)!

Как установить пароль для пользователя root в MySQL?
Так как установка MySQL по умолчанию производится максимально открытой, первое, что Вы должны сделать - определять пароль для пользователя root в MySQL.

Вы можете сделать это следующим образом:

shell> mysql -u root mysql
mysql> SET PASSWORD FOR root@localhost=PASSWORD('new_password');

Если Вы достаточно уверены в своих действиях, вы можете непосредственно манипулировать таблицами привилегий:

shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
           WHERE user='root';
mysql> FLUSH PRIVILEGES;

Другой путь устанавливать пароль - используя команду mysqladmin:

shell> mysqladmin -u root password new_password
*) Как только пароль для пользователя root будет установлен, Вы должны использовать этот пароль при подключении к MySQL серверу от имени root!

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

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

mysql> SET PASSWORD=PASSWORD('new password');

Имейте в виду, что если Вы корректируете пароль непосредственно в таблице user, Вы должны дать серверу команду, перечитать таблицы привилегий:

mysql> FLUSH PRIVILEGES;

- в противном случае изменений не произойдет!

Первичная настройка привилегий в MySQL под Windows
Так как установка MySQL по умолчанию производится максимально открытой, первое, что Вы должны сделать - определять пароль для пользователя root и удалить анонимного пользователя в MySQL.

Вы можете сделать это следующим образом:

путь_к_директории_MySQL\bin> mysql mysql
mysql> DELETE FROM user WHERE Host='localhost' AND User='';
mysql> QUIT
путь_к_директории_MySQL\bin>mysqladmin reload
путь_к_директории_MySQL\bin>mysqladmin -u root password your_password
После того, как вы установили пароль для пользователя root, Вы должны использовать его при обращении к серверу как root. Например:
путь_к_директории_MySQL\bin>mysqladmin --user=root --password=your_password shutdown
ВНИМАНИЕ! Рекомендую так же удалить всех анонимных пользователей и пользователей с неустановленным паролем!

Дело в том, что по умолчанию при установке создается НЕ ТОЛЬКО root и анонимный пользователь для localhost!

Host  User  Password  ...
----  ----  --------  
...
%     root   
%                    
Значение % в столбце Host означает любой - Вам это надо? Думаю нет, так что:
путь_к_директории_MySQL\bin> mysql -uroot -pyour_password mysql
mysql> DELETE FROM user WHERE User='';
mysql> DELETE FROM user WHERE Password='';
mysql> QUIT
путь_к_директории_MySQL\bin> mysqladmin -uroot -pyour_password reload
Создание баз данных и доступ к ним для отдельных проектов
Вообще работать из под пользователя root "дурной тон" и крайне не безопасное дело.

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

Операция это не сложная, делать это нужно из под пользователя root:

mysql> CREATE DATABASE mydatabase_name; 
mysql> GRANT ALL PRIVILEGES ON mydatabase_name.* TO user_name@host_name 
          IDENTIFIED BY 'password';
где
user_name - имя пользователя
host_name - хост , с которого будет производиться соединение (м.б. localhost)
password - пароль, с которым будет производится соединение.
Как выбрать ограниченное количество строк-записей?
SELECT ... FROM <table> ... LIMIT 
[offset,]rows
где:
offset - смещение, т.е. с какой записи в выборке начинать;
rows - количество выбираемых строк-записей.
Надежный способ указать значения для даты и времени
В MySQL есть следующие типы данных для работы с датой и временем
Тип "нулевое значение"
DATETIME '0000-00-00 00:00:00' ( подразумевается 'ГГГГ-ММ-ДД ЧЧ:мм:СС' )
DATE '0000-00-00' ( подразумевается 'ГГГГ-ММ-ДД' )
TIMESTAMP 00000000000000 ( подразумевается 'ГГГГММДДЧЧммСС',
размерность поля настраиваемая )
TIME '00:00:00' ( подразумевается 'ЧЧ:мм:СС' )
YEAR 0000 ( подразумевается 'ГГГГ' )


Оставим YEAR в стороне и посмотрим на дату и время.
mysql> create table test (d date not null, t not null, 
    -> dt datetime not null, ts timestamp(14) not null);
Query OK, 0 rows affected

mysql> insert into test (d,t,dt,ts) values('20021126022401', 
    -> '20021126022401', '20021126022401', '20021126022401');
Query OK, 1 row affected
Что мы указали как значение для всех полей?

Мы указали запись вида 'ГГГГММДДЧЧммСС'. Т.е., фактически, дату и время в формате TIMESTAMP.

Но в нашей таблице есть поля меньшей размерности и с другим смыслом (время, к примеру)! Что же получилось?

mysql> select * from test;
+------------+----------+---------------------+----------------+
| d          | t        | dt                  | ts             |
+------------+----------+---------------------+----------------+
| 2002-11-26 | 02:24:01 | 2002-11-26 02:24:01 | 20021126022401 |
+------------+----------+---------------------+----------------+
1 row in set
Таким образом, при полном указании даты и времени, MySQL самостоятельно сделал корректные преобразования для соответствующих типов данных! Еще пример: укажем только дату (8 цифр ГГГГММДД)
mysql> update test set d='20021126', t='20021126', dt='20021126'б , ts='20021126';
Query OK, 1 row affected

mysql> select * from test;
+------------+-----------+---------------------+----------------+
| d          | t         | dt                  | ts             |
+------------+-----------+---------------------+----------------+
| 2002-11-26 | 838:59:59 | 2002-11-26 00:00:00 | 20021126000000 |
+------------+-----------+---------------------+----------------+
1 row in set
Что такое? Какое-то странное время... Я не буду гадать что же получилось со временем, а просто исправлю ситуацию:
mysql> update test set t='000000';
Query OK, 1 row affected

mysql> select t,dt from test;
+---------+---------------------+
| t       | dt                  |
+-------- +---------------------+
| 00:00:0 | 2002-11-26 00:00:00 |
+---------+---------------------+
1 row in set

Просто учтите, что для поля типа TIME нужно передавать значение из 6 (шести) цифр вида: ЧЧммСС

А для полей с датой можно передавать только 8 (восемь) цифр: ГГГГММДД

ВНИМАНИЕ! С полем типа TIMESTAMP могут происходить некоторые "казусы".
Посмотрите соответствующий пункт F.A.Q.
TimeStamp и все о нем

В: Тип данных TIMESTAMP

О: Прежде всего, несколько правил:
1. поле типа TIMESTAMP не может принимать
   значение NULL;

2. при явном указании значения NULL, поле примет значение
   текущей даты и времени ( как если бы вы указали NOW() );

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

       а) если в записи только одно поле типа TIMESTAMP,
          его значением станет значение текущей даты
          и времени;
       б) если таких полей несколько, то значением первого
          будет текущая дата и время, а для остальных
          - значение по умолчанию ( '00000000000000' для
          TIMESTAMP(14) );

Для того, чтобы при обновлении других полей записи "не повредить" поле типа TIMESTAMP, пишите:
mysql> desc test;
| Field | Type          
| Null | ...
+-------+---------------+------+----
| name  | varchar(128)  |      |
| ts    | timestamp(14) |      |
+-------+---------------+------+----
2 rows in set

mysql> update test set name='Вася', ts=ts;

- присвоить полю типа TIMESTAMP его же значение. Иначе - поле примет значение текущей даты и времени ( так как оно одно - см. правило 3а ).

Полный формат TIMESTAMP - ГГГГММДДЧЧммСС - 14 цифр:
  4 цифры - год - %Y для формата вывода date_format(date [,format string])
  2 цифры - месяц - %m для формата вывода date_format(date [,format string])
  2 цифры - число - %d для формата вывода date_format(date [,format string])
  2 цифры - час - %H для 24-х часового формата вывода date_format(date [,format string])
  2 цифры - минуты - %i для формата вывода date_format(date [,format string])
  2 цифры - секунды - %s для формата вывода date_format(date [,format string])

Размерность TIMESTAMP можно изменить, указав один из вариантов:
  - TIMESTAMP(14) ГГГГММДДЧЧммСС
  - TIMESTAMP(12) ГГММДДЧЧммСС
  - TIMESTAMP(10) ГГММДДЧЧмм
  - TIMESTAMP(8)  
ГГГГММДД
  - TIMESTAMP(6)  ГГММДД
  - TIMESTAMP(4)  ГГММ
  - TIMESTAMP(2)  ГГ

Я рекомендую всегда пользоваться явным указанием размерности при создании поля типа TIMESTAMP. Более того, советую использовать или формат TIMESTAMP(14) или TIMESTAMP(8), если Вас интересует только дата.
ВНИМАНИЕ! При использовании TIMESTAMP(14) старайтесь всегда присваивать полю значения из 14-ти цифр.  Бывают случаи, когда, при указании только восьми цифр даты, MySQL неверно трактовал  укороченные запись и дописывал "нули" слева, а не справа, вместо времени.
Еще одно замечание про TIMESTAMP. Если поле принимает значение "ноль" ( '00000000000000' в случае TIMESTAMP(14) ), то смысл этого значения не "новый год номер 1 после Р.Х.", а "последний новый год перед Р.Х.". Т.е. - это год номер 0, которого не было.

Таким образом, в случае с TIMESTAMP, все числа в интервале '00000000000000 ' + интервал в 365 дней не имеют смысла, осмысленный счет начинается с 00010101000000!

Отсюда еще одно правило:
4. Если полю передано недопустимое значение
   (например, -1), то поле типа TIMESTAMP
   в этом случае принимает нулевое значение, даже
   если оно первое по счету или единственное в таблице.
Как узнать значение автоинкрементного поля после команды INSERT
В Mysql есть встроенная ф-ция LAST_INSERT_ID(); вызывать ее следует сле. обаразом select LAST_INSERT_ID();
Как произвести пакетное обновление большого числа записей
<<< INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6) ON DUPLICATE KEY UPDATE 1=VALUES(a), b=VALUES(b), c=VALUES(c); >>> Подразумается, что в таблице имеется уникальный ключ.
Powered by POEM™ Engine Copyright © 2002-2005