MySQL запрос работает вручную, но не возвращает результатов при запуске из кода - PullRequest
2 голосов
/ 31 мая 2009

Я использую очень простой запрос с «Like», чтобы найти товар по его названию

SELECT p_pid, p_name, p_cat
FROM products
WHERE p_sid=346 AND p_name LIKE 'product name here in utf-8 encoding, can be various languages'
LIMIT 1

Когда я запускаю этот запрос из кода с правильным именем продукта, я не получаю результатов. Если я копирую запрос (повторяет php в браузер) и запускаю его вручную в браузере запросов MySQL, я получаю результат. Есть идеи, где я не прав?

Примечания:

1.В запросе нет ошибок. Просто нет результатов. 2. Я использую библиотеку ezsql 3. Код работает хорошо и успешно выполняет другие операции SELECT с базой данных в той же области кода.

Ответы [ 3 ]

3 голосов
/ 31 мая 2009

Кажется, проблема с кодировкой.

Попробуйте выполнить этот запрос:

SELECT HEX(CAST('product name here in utf-8 encoding, can be various languages' AS BINARY))

как в ezSQL, так и в браузере запросов и сравните результаты.

Это даст вам двоичный поток, который MySQL действительно получает от вашего клиента и использует для сравнения.

Если в свойствах ezSQL установлена ​​неправильная кодировка соединения, строка может быть искажена (например, вопросительные знаки вместо UTF символов).

В этом случае сравнение, конечно, не удастся.

Обновление:

Попробуйте принудительно сопоставить регистр без учета регистра:

SELECT  *
FROM    table
WHERE   field LIKE 'product name here in utf-8 encoding, can be various languages' COLLATE UTF8_GENERAL_CI

Кроме того, не могли бы вы опубликовать двоичный дамп как вашей строки, так и данных, содержащихся в поле?

SELECT  p_pid, p_name, p_cat,
        HEX(CAST(p_name AS BINARY)),
        HEX(CAST('product name here in utf-8 encoding, can be various languages' AS BINARY))
FROM    products
WHERE   p_pid = @pid_of_product_that_should_match_but_it_doesnt
1 голос
/ 31 мая 2009

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

0 голосов
/ 31 мая 2009

Может ли это быть ошибкой кодирования, не посылая нужную информацию через код, поэтому она ищет что-то, отсюда и отсутствие ошибки, но не то, что она должна искать. Сканируйте свой код вручную, заново выполняйте биты и посмотрите, обнаружите ли вы там что-нибудь, что может быть проблемой.

Фрагменты PHP могут помочь, если они действительно являются ошибкой кодирования.

Надеюсь, это поможет.

...