Архив рубрики: MySQL

Коварный UNION..

Иной раз не знаешь где затупишь. Казалось бы простой запрос с использованием UNION, а потратил кучу времени, чтобы выяснить, почему он иногда не корректно отрабатывает.

Было:

$sql="select * from (select amount,local_date as date,managers.fio as tar_id,'enter' as type from payments inner join managers on payments.mod_person=managers.person_id where agrm_id='$agrm_id' UNION  "
 . "SELECT amount,DATE_ADD(period, INTERVAL 1 DAY) as date,tarifs.descr as tarif,'inet' as type FROM rentcharge inner join tarifs on rentcharge.tar_id=tarifs.tar_id where rentcharge.agrm_id='$agrm_id' and amount<>0 UNION "
 . "select usbox_charge.amount,usbox_charge.charge_date,tarifs.descr as tarif,'tv' from usbox_charge inner join usbox_services on usbox_charge.serv_id=usbox_services.serv_id inner join tarifs on tarifs.tar_id=usbox_services.tar_id where usbox_charge.amount<>0 and usbox_charge.agrm_id='$agrm_id') as res order by date";

Стало:

$sql="select * from (select amount,local_date as date,managers.fio as tar_id,'enter' as type from payments inner join managers on payments.mod_person=managers.person_id where agrm_id='$agrm_id' UNION ALL "
 . "SELECT amount,DATE_ADD(period, INTERVAL 1 DAY) as date,tarifs.descr as tarif,'inet' as type FROM rentcharge inner join tarifs on rentcharge.tar_id=tarifs.tar_id where rentcharge.agrm_id='$agrm_id' and amount<>0 UNION ALL "
 . "select usbox_charge.amount,usbox_charge.charge_date,tarifs.descr as tarif,'tv' from usbox_charge inner join usbox_services on usbox_charge.serv_id=usbox_services.serv_id inner join tarifs on tarifs.tar_id=usbox_services.tar_id where usbox_charge.amount<>0 and usbox_charge.agrm_id='$agrm_id') as res order by date";

В чем соль? Оператор UNION без опции ALL оказывается обладает свойствами группировки одинаковых значений в запросе. Например у меня, при одинаковых одновременных значениях даты и суммы происходила группировка этих строчек в одну…

Сортировка в MySQL кириллицы utf8-general-ci

загруженное (1)Дано: MySQL 5.1.72, таблицы созданные в utf8-general-ci, установка соединения вызывается следующей функцией:

function connect($host,$name,$pass,$base){
 $this->idsqlconnection=new mysqli($host,$name,$pass,$base);
 if (mysqli_connect_errno()) {
 $serr=mysqli_connect_error();
 die("Error connect to Mysql or select base: $serr");
 } 
 $result = mysqli_query($this->idsqlconnection,"SET NAMES utf8_general_ci"); 
 mysqli_set_charset($this->idsqlconnection, "utf8_general_ci");
 
 }

И хоть ты тресни, запрос вида:

$SQL = "SELECT * FROM places WHERE orgid='$orgid' AND active=1 ORDER BY name";
 $result = $sqlcn->ExecuteSQL( $SQL ) or die("Не могу выбрать список помещений!".mysqli_error($sqlcn->idsqlconnection));

Сортировался по непонятно каким критериям. Потеряв на поиск причины  несколько часов, перепробовав кучу «рецептов», пришлось заворачивать сортировку запросов в команду binary(), т.е. вот так:

$SQL = "SELECT * FROM places WHERE orgid='$orgid' AND active=1 ORDER BY binary(name)";

Костыль конечно.. И сортирует различая большие и маленькие буквы. Но таки лучше так чем никак. Ищу лучшее решение.

Различия MySQL поставленной на Windows и Linux

Довелось писать приложение которое работает и с MySQL установленной на Windows и с MySQL установленной на Linux. Оказывается есть различия. Пришлось сначала вычищать код,чтоб приложение написанное и оттестированное на MySQL Lin заработало как нужно на MySQL Win.

1) На MySQL Windows машине не должно быть в конце запроса » ; »
2) При выполнении запроса на MySQL Windows выполняется проверка,»влезает ли»передаваяемое значение в ячеку. Т.е. если например обьявлено что в таблице поле VarChar(10), то при попытке засунуть туда строку длинной 20 символов,MySQL Win ругнется, а Linux просто обрежет