MYSQL, невозможно сравнить (выровнять) два значения

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

SELECT `name` FROM `table` WHERE `id` = 'roman' GROUP by `name`

и он возвращает мне нулевое значение, я уверен, что код правильный, потому что он работает с другими таблицами. Я заметил, что если я иду к столу, уберите id значение, а затем введите его снова вручную, он работает просто отлично (даже если остальные значения выглядят одинаково). Моя таблица была импортирована из CSV-файла, но я уверен, что у меня нет пробелов / букв / неправильных символов и т. Д. В конце строк (даже проверено это с помощью HexEdit). Например, если я использую:

SELECT `name` FROM `table` WHERE `id` LIKE 'roman%' GROUP by `name`

затем это работает, так что кажется, что-то не так со значениями идентификатора. Я тоже пытался изменить кодировку.

1

Решение

Наиболее вероятное объяснение состоит в том, что в столбце хранится непечатный символ, вероятно, возврат каретки, табуляция или перевод строки.

Чтобы выяснить это, попробуйте получить шестнадцатеричное представление сохраненного значения и длину в байтах.

SELECT HEX('roman')
, LENGTH('roman')
, HEX(t.id)
, LENGTH(t.id)
FROM mytable t
WHERE t.id <> 'roman'
AND t.id LIKE 'roman%'

(Возможно, что происходит преобразование набора символов. Тот же самый запрос выше покажет некоторые детали.)


В конце сохраненного значения есть символ возврата каретки, десятичное значение 13. Сравнить с:

SELECT HEX('roman\r')

HEX('roman\r')
----------------
726F6D616E0D
^^

Чтобы удалить ВСЕ вхождения символов возврата каретки из id столбец (не только конечный), вы можете использовать REPLACE функция.

SELECT HEX(REPLACE('ro\rman\r','\r',''))

HEX(REPLACE('ro\rman\r','\r',''))
-----------------------------------
726F6D616E

в выражении UPDATE, например

UPDATE mytable SET id = REPLACE(id,'\r','')

Если id последнее поле в файле .csv, вероятно, в файле строки заканчивались в стиле DOS, с возвратом каретки и переводом строки; и процесс, который считывал входной файл, удалял только перевод строки и оставлял возврат каретки как часть данных.

1

Другие решения

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

ВЫБРАТЬ name ОТ table ГДЕ id LIKE ‘Roman_‘ Группа по name

поэтому он «пропустит» последний символ и все равно не выберет другие мои значения, такие как: roman_string roman_string2 и т. д. Возможно, это не лучшее решение, но это лучше, чем тратить много времени на восстановление сценария импорта CSV-файла 🙂 Спасибо

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector