сравнение строк не работает MySQL

Я создал скрипт на PHP, который в основном загружает CSV (сгенерированный извне) с именами в базу данных MySQL, а затем обрабатывает каждую строку, чтобы определить, является ли имя мужским или женским, используя внешний API.

Как только он оценил каждую строку (имя), он сохраняет имена во вторичных таблицах (существующие имена или отсутствуют в зависимости от результата).

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

SELECT DISTINCT nl.name
FROM namelist nl
LEFT JOIN (
SELECT name
FROM missing
UNION
SELECT name
FROM existing_names
) en ON en.name = nl.name
WHERE en.name IS NULL

Из этого запроса я получаю набор новых строк, которые будут оцениваться с помощью API.

Моя БД и все мои таблицы имеют это значение как Collation: utf8_unicode_ci, но я получаю странные результаты, так как имена типа «A LUIGI» имеют разные длины в обеих таблицах: «8» в списке имен и «7» в существующем.

В результате вышеприведенный запрос возвращает большое количество имен, которые уже были оценены.

Два вопроса:
1. Как мне структурировать запрос для стандартизации сопоставления в этом случае?
2. Какой код я должен добавить в свой PHP-скрипт, чтобы избежать заполнения БД строками с другим сопоставлением?

Спасибо за ваше время.

2

Решение

Мусор на входе, мусор на выходе. Возможно, у вас есть лишний пробел в «A LUIGI» в одной из таблиц. Для отладки, пожалуйста, сделайте

SELECT name, LENGTH(name), CHAR_LENGTH(name), HEX(name)
FROM ...
WHERE name LIKE '%LUIGI%';

для каждого стола.

  • Для версии с 7 символами я бы ожидал, что обе длины будут равны 7, а HEX будет 41204C55494749,

  • Если есть дополнительный 20 в начале или в конце, то вы должны были использовать TRIM как вы вставили текст.

  • Если есть дополнительный 20 в середине это еще один случай GIGO.

  • Если CHAR_LENGTH 7 но LENGTH это 8, тогда нам нужно посмотреть на HEX, чтобы увидеть, если какой-то символ utf8 тушит как английская / итальянская буква.

Как только у вас есть HEX для двух строк, мы можем обсудить вопросы «сортировки».

2

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

Других решений пока нет …

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