За последние 24 часа нас посетили 20305 программистов и 1010 роботов. Сейчас ищут 367 программистов ...

MySQL. Глюки.

Тема в разделе "MySQL", создана пользователем Chushkin, 15 фев 2015.

  1. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Обожаю линуксоидов!
    Регулярно дают повод пнуть их. :D

    v.5.6.22
    Очередной глюк: Если в подзапросе используется переменная, то движок не использует индексы. И не даёт использовать.

    Код (PHP):
    1. set @= 1;
    2. select * 
    3. from Mans /* force index (primary) */
    4. where eManID = (select 1 from dual where @a)
    5.  
    Код (PHP):
    1. EXPLAIN Result
    2. id select_type           table  type   possible_keys key    key_len ref    rows    Extra
    3. 1  PRIMARY               Mans   ALL    (NULL)        (NULL) (NULL)  (NULL) 1814845 Using where
    4. 2  UNCACHEABLE SUBQUERY  (NULL) (NULL) (NULL)        (NULL) (NULL)  (NULL) (NULL)  No tables used
    Добавлено спустя 5 минут 35 секунд:
    Про глюк LPAD см. здесь: viewtopic.php?f=20&t=48259

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    v.5.6.22
    Глюк REGEXP (rlike):
    Код (Text):
    1. select '' REGEXP concat('(',field) from table
    Не выдаёт ошибку регулярного выражения. Всегда будет NULL.

    Код (Text):
    1. select '' REGEXP concat('(','1') from table
    Выдаёт ошибку.
     
  3. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Win, v 5.6.26 x64
    1) LPAD, - баг имеется. 14 месяцев... ( viewtopic.php?f=20&t=48259 )
    2) REGEXP (rlike), - баг имеется. 5 месяцев... (см.выше)
     
  4. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Win, v 5.7.20 x64
    1) LPAD, - баг имеется. 41 месяц, 3.5 года.
    2) REGEXP (rlike), - баг имеется. 32 месяца, 2.5 года.
     
  5. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Пнём линуксоидов из Oracle ещё раз...
    Win, v 5.7.20 x64
    Эти, эээ, "гении" упорядочивают параметры JSON по их длине.

    Тест:
    PHP:
    1. select json_object('111', 1, '22', 1, '3', 1) f
    Результат:
    Код (Text):
    1. {"3": 1, "22": 1, "111": "1"}
     
  6. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А ты чего ожидал? Что тебе заботливо сохранят порядок?
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Список наверное не будет упорядочивать
    Код (Text):
    1.  
    2. [11,2,111,22]
    и это логично
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Уверен, что глюк, а не документированная особенность работы?
     
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    И это рассказывается в разделе про индексацию json-полей.

    Впрочем, тут уже диагноз, удаляюсь из темы.
     
    Fell-x27 нравится это.
  10. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Не уверен.
    Но эта "особенность" неправильная, в стиле линуксоидов. Порядок полей в таблице сохраняется, а в JSON-структуре нет. Где логика?
     
  11. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Пнём линуксоидов из Oracle ещё раз...
    Win, v 5.7.20 x64
    Глюк now(), - не округляет микросекунды, просто тупо обрезает.

    Тест:
    PHP:
    1. select now(6), now(2)
    --- Добавлено ---
    И тут попутно возникает вопрос.
    Время с долями секунды = '00:00:00.7'.
    При получении времени в секундах сколько должно быть? '00:00:00' или ''00:00:01'?
    По моей логике - второе.
     
  12. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Chushkin таки на 00:00:00.7 еще не прошло 10 миллисекунд
     
  13. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    [vs] Ты о чём?
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Chushkin я подумал, что 00:00:01 - это 10 миллисекунд. Тем более если это одна секунда, то в какой ситуации может быть полезным округлять?
     
  15. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Какая разница, 1 секунда или 0.59? Важен алгоритм.
    Если время с долями секунды, то правильно округлять, а не отбрасывать.
    По сути, функции работы со временем должны учитывать точность времени - если целочисленное время (по старому), то как было; если дробное - то округлять до заданной форматом точности.
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    @Chushkin хз. Вот добавляется у тебя 10 записей в секунду, а время задано с точностью до 1 секунды. В итоге у тебя 16 записей будут выглядеть так
    Код (Text):
    1. 00:00:00
    2. 00:00:00
    3. 00:00:00
    4. 00:00:00
    5. 00:00:00
    6. 00:00:01 // 00:00:00.5
    7. 00:00:01
    8. 00:00:01
    9. 00:00:01
    10. 00:00:01
    11. 00:00:01
    12. 00:00:01
    13. 00:00:01
    14. 00:00:01
    15. 00:00:01
    16. 00:00:02 // 00:00:01.5
    По-моему это ерунда какая-то...
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ды вот и мне, хоть доку и не читал на эту тему, показалось, что очень уж похоже на индексы табличные. Прям вот 1-в-1. Разве что табличные индексы это shadow-data.

    Далее, JSON никогда не гарантировал правильный порядок свойств при сериализации-десериализации. Надеяться на это - глупо. Я больше скажу - надеяться на порядок столбцов в таблице тоже глупо. Это прям настолько благодатная почва для неуловимых багов, что оягребу. Хочешь завязать алгоритм на порядок столбцов? Укажи этот порядок явно в запросе.
     
  18. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    По логике - правильно.
    К примеру, если задал с долями секунды (timestamp(1)), при выводе "as is", время будет с десятыми долями. В принципе, сейчас так и есть, за исключением глюка - микросекунды не округляются, а отбрасываются.
    Если же хочешь результат с меньшей точностью, то нужно округлять. Собственно, как при любой работе с вещественными числами.
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    С округлением пропадает представление о точном времени. 1 наступает на 0.5, это бред.
     
  20. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Предположим. А что делать с JSON?

    Вообще, дело не в "надежде", а в удобстве. Всё, что есть в программировании это ради удобства разраба, иначе до сих пор писали бы в машинных кодах.
    --- Добавлено ---
    Не знаю, не знаю...
    Не уверен.
     
  21. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Если 1 наступает на 0.5, то 0.5 наступает на 0.45, а 0.45 на 0.445, и т.д.
     
  22. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    И?
    Есть правила round() для округлении. А уж как ты их применишь, дело хозяйское.
     
  23. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Ну, если мне не изменяет память, то порядок столбцов всё же описывается в стандарте. Хотя, надеяться на это можно с таким же успехом, как и на то что SELECT * FROM table LIMIT 10 отдаст первый 10 записей таблицы, а не первый попавшийся десяток ) А в случае с JSON все так и есть, что бы иметь возможность по нему искать не слишком теряя в скорости, движок его "допиливает" под себя. Вот, раздел доков posgtes по теме, там в общих чертах, но суть ясна.
     
    Fell-x27 нравится это.
  24. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Вот он - пример дьявологики :)
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    А если мне не изменяет память, то в самом JS упорядоченность и способ хранения данных в структуре остается на усмотрение конкретной версии конкретного движка. Где-то хранится порядок, в котором данные были внесены, а где-то работает автоматическая сортировка. Это речь именно про реальные объекты в JS. При этом, собсна, при чтении JSON, не важно как он был упорядочен, так как движок все равно имеет свое мнение на этот счет.

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

    Когда ты пишешь что-то в JSON-поле БД, ты не JSON-строку же хранишь. Ты говоришь базе "возьми эту вот структуру и сохрани ее как структуру, а я буду к ней обращаться как к структуре." То есть вот реальный JSON - это то, что ты БД отдал как часть запроса. То, что ты видишь в БД - это уже то, как БД твой JSON прочитала. И хранит она его не как JSON, а как объект. Просто показывает его тебе в удобном для тебя виде. Но делать с этим объектом она уже вольна что угодно. Подразумевается, что это как бы микроБД внутри БД, а не просто поле, в которое ты JSON положил, чтоб потом обратно забрать.

    Если нужно просто класть в БД JSON и забирать его оттуда "как есть", храни его как строку и не парься, как грицца.
     
    romach и Maputo нравится это.