За последние 24 часа нас посетили 22872 программиста и 1230 роботов. Сейчас ищет 791 программист ...

Чудеса со строкой "true" в БД )))

Тема в разделе "MySQL", создана пользователем Dmitriy A. Arteshuk, 24 окт 2014.

  1. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    имеем табличку....много столбцов, одно из них varchar(10) в нем либо пустая строка, либо true

    запрос

    Код (Text):
    1. SELECT * FROM `table` WHERE `field` = 'true'
    вернет ноль строк....с какого перепугу???

    Код (Text):
    1. SELECT * FROM `table` WHERE `field` LIKE 'true'
    то же ноль....

    Код (Text):
    1. SELECT * FROM `table` WHERE `field` LIKE '%true%'
    и только так оно что то найдет....

    Оно строку true как то извращенно понимает???

    Добавлено спустя 6 минут 20 секунд:
    твою ж мать!!!

    Код (Text):
    1.  
    2. var_dump
    3. ["field"]=> string(5) "true "
    там пробел лежит (((

    Код (Text):
    1. SELECT * FROM `table` WHERE `field` = 'true '
    но так то же ноль (
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    ищет подстроку true внутри строки. и находит. а остальные конструкции требуют четкого следования четырех байт - t,r,u,e в строке и только их. и не находят потому что их там нет.
    если сделать select hex(field) то нам нужно увидеть 74727565 чтоб там было то что попадает под = 'true' и like='true'. но скорее всего будут другие значения.
     
  3. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    select hex(field) => 747275650D
     
  4. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Это всё говорит о том, что вместо varchar(10) хорошо бы переделать на boolean
     
  5. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    это не реально, ибо там не только true бывает
     
  6. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Соответственно тип ENUM к вашим услугам.
    Если же там может быть true или любое осмысленное значение без ограничений, то таблица с неправильной структурой.
     
  7. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Не факт, - скорее "пробельный" символ. Надо использовать trim() при вставке в БД. Причём для функции прописать коды всех пробельных символов, в т.ч. и 0D. (если UNICODE, то там сложнее - одним trim не отделаться)
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    0d это \r
     
  9. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    Господа, речь не о структуре таблиц и типе полей

    понятное дело что неправильная, данные лежат не так и т.д....это все дело сто сорок пятое...понимаете???

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

    резонный вопрос, парень!! акстись!!! оно 10 лет работает и все всех устраивает кроме тебя умника блеать!!!

    Тетя Таня 10 лет складывает данные с переносом строки в бд, как ЕЁ в ЕЁ 69 лет мы переучим???

    как то так....

    вопрос собна решен, "лайком" выберем, там не много...
     
  10. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Ну конечно. Универсальное решение для хранения истины в бд.

    Добавлено спустя 3 минуты 55 секунд:
    Ну уж не всю структуру бд менять. Один тип в таблице выбрать человеческий чтобы последователи не спотыкались о те же камни что вы.
    Делается двумя запросами и максимум поправкой 1 модельки.
    Всёравно же будете проходить таблицу и убирать пробелы у значений "true ".
    Вопрос не решён а отложен ещё на год... .
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    опять огород городишь, Дим, ну чесслово.
     
  12. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    во...выяснилось что это LOAD DATA INFILE туда перенос строки фигачит....10 лет как...
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    tinyint есть для тру/фалс и прочего мусора.
     
  14. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    LOAD DATA INFILE пока не научился типы данных приводить (
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ты как хочешь конечно. но оно там в файле не с неба падет. =)
     
  16. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    конечно нет, там обычный файл

    бла.бла.бла.бла перевод строки
    бла.бла.бла.бла перевод строки
    бла.бла.бла.бла

    вот оно его хавает и перегоняет в БД..вместе с переводом )
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    там наверное перевод \n\r или \r\n а оно считает правильным только \n или только \r =)
     
  18. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    хз че он там считает, но факт есть факт )
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ну это я к тому что это можно вот легко контролировать, раз ты локализовал проблему
     
  20. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    А так не работает?
    Код (Text):
    1. LOAD DATA INFILE ...
    2.   INTO TABLE t
    3.   (@var)
    4.   SET t.flag = if(@var = 'true', true, false);
     
  21. dapperkop

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

    С нами с:
    26 сен 2013
    Сообщения:
    890
    Симпатии:
    0
    В mysql тоже есть трим, по моему...
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    что-то Дмитрий уже порывался в базе уменьшать на 1 символ с помощью пхп-скрипта. видимо проблема нелеченного символа \r уже проявлялась.

    а всего делов перед импортом обрабатывать файл dos2unix
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    Ож бож! вотоночо михалыч вотоночо! Разгадка оказалась проста.
     
  24. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.076
    Симпатии:
    1.237
    Адрес:
    там-сям
    по умолчанию считается, что строка заканчивается по юниксовски. ты можешь либо приводить исходные файлы к стандарту (я бы так и делал), либо заточить импорт на досовский стандарт.
    LOAD DATA LOCAL INFILE … LINES TERMINATED BY '\r\n'
    тогда лишний \r не будут попадать в таблицу. не надо, блин, нашивать заплатки на заплатки. это косяк и его надо лечить.
    Код (Text):
    1. UPDATE `table` SET `field` = TRIM(TRAILING '\r' FROM `field`)
     
  25. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    я люблю ВАС парни! )

    Добавлено спустя 43 секунды:
    не, это из другой оперы )