• Почему не работает сортировка списка в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    5e3948e66cddf596697310.png
    Есть похожие или даже одинаковые по начертанию, но совершенно разные по коду и порядку символы в юникоде.
    Это часто вызывает проблемы.
    Если вы точно знаете, что в ваших именах должны быть только русские буквы, то можете обработать строки заменяя похожие по начертанию символы. В таком виде, конечно, решение не пригодно в случае, если у вас попадётся имя полностью на английском.
    Можно также проверять наличие непохожих по начертанию символов в имени, и если таковые есть, значит замены сделаны не по ошибке. Можно сделать автоматическую обратную подстановку, если в имени нет непохожих на английские русских букв.
    В любом из этих случаев могут возникнуть ситуации некорректного трактования имени. К примеру к вам пришел "АВРААМ" и утверждает, что его родители большие затейники, русского не знают, к евреям отношения не имеют, а дома его называют "Абпаамом".
    users = ["Андрей", "София", "Cветлана", "Валерий", "Илья", "Mаксим", "Дмитрий", "Лиза"]
    trans_table = str.maketrans(
        'ABCEHKMOPTXacekmopuxy', 
        'АВСЕНКМОРТХасекмориху',
    )
    russian_letters_normalizer = lambda s: s.translate(trans_table) if isinstance(s, str) else s
    print('Original:', users)
    print('Sorted:  ', list(sorted(users, key=russian_letters_normalizer)))
    Ответ написан
    Комментировать
  • Почему MySQL неправильно сортирует по дате?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега MySQL
    Потому что после DATE_FORMAT вы сортируете не даты, а просто строки.
    Попробуйте так: ORDER BY orders.date DESC
    Ответ написан
    Комментировать
  • Почему не срабатывает TRUE в SQL запросе?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Отвечу на вопрос "почему".
    Потому что приведение типов.
    Строка "FALSE" - это не булево значение FALSE, а строка, 5 букв. Не имеющая никакого отношения к булевым значениям или числам. Присравнении с числом и РНР и mysql пытаются привести строку к числу. При этом из строки "FALSE" получается 0. И поэтому сравнение "работает". Но разумеется так сравнивать нельзя.

    Строка "TRUE" - это, как уже должно быть понятно, не булево значение TRUE, а строка, 4 буквы. Не имеющая никакого отношения к булевым значениям или числам. Присравнении с числом и РНР и mysql пытаются привести строку к числу. При этом из строки "TRUE" получается 0. И поэтому сравнение "не работает". Если передать не строку а булево значение TRUE, то сработает.

    Поскольку в mysql нет типа поля boolean, лучше всего не выпендриваться с TRUE и FALSE, а просто передавать 0 и 1.
    Ответ написан
    Комментировать
  • Почему SQL-запрос не захватывает строки с NULL?

    ThunderCat
    @ThunderCat Куратор тега MySQL
    {PHP, MySql, HTML, JS, CSS} developer
    NULL в мускуле не является нулем, это отдельный тип данных не входящий в сравнительные диапазоны и должен быть проверен отдельно, то есть надо добавить or currency_code IS NULL
    Ответ написан
    3 комментария