Проблема с Perl или MySQL - PullRequest
       6

Проблема с Perl или MySQL

1 голос
/ 07 декабря 2010

Я пытаюсь закодировать очень простой запрос MySQL SELECT, согласно приложенному:

#
# MODULES
#

use strict;
use DBI;
use DBD::mysql;

#
# CONNECT
#
my $dbd = DBI->connect("dbi:mysql:dbname=$db_name;host=$host;mysql_server_prepare=1;",$db_user, $db_pwd)
or die 'No connection to dB : '.DBI::errstr;
#
# PREPARE
#
my $query = "SELECT * FROM $table WHERE $search_field = ? ";
my $prep = $dbd->prepare($query)
    or die "ERR: " .$dbd->errstr;
#
# EXECUTE    
#
$prep->execute( $search_data )
    or die 'ERR : '.$prep->errstr;
#
# SHOW
#
while (my @data = $prep->fetchrow_array ) {
    foreach my $line (@data) {
       print $line.', ';
    }
    print "\n";
}

Поле поиска с TinyText.(но пробовал также varchar, тот же результат) Поле поиска кодируется utf8_unicode_ci (но пробовал также latin_general_ci, тот же результат)

Если я запускаю запрос с цепочкой только для чисел для $ search_data (как 0124345): нормально, Я получаю результат
Если я запускаю запрос с цепочкой только для текста для $ search_data (например, AZERTY): хорошо, я получаю результат

НО:

Если я запускаюзапрос со смешанным текстом / числами (например, AZERTY01234): запись не найдена,
Если я выполню запрос со смешанным текстом с тире, точкой и т. д. (например, foo-bar): запись не найдена
Если я запустилзапрос со смешанным текстом с тире, точкой и т. д. (например, foo + bar): запись не найдена

Я пробовал несколько возможных исправлений, но безуспешно.(изменение типа данных SQL с использованием и без простых / двойных кавычек, без подготовленного запроса ...)

Я понятия не имею, почему и как его решить.

Спасибо заранеедля некоторых подсказок.

1 Ответ

0 голосов
/ 07 декабря 2010

Похоже, что Perl может сбивать с толку строки, числа и их арифметику.

Перефразируя OReilly Программирование Perl DBI , чтобы помочь определить, какой тип данных передается в значении связывания, вы можете предоставить дополнительный аргумент, который указывает тип данных при выполнении привязки.

В вашем случае я бы попробовал что-то вроде следующего, чтобы принудительно связать текстовый тип / SQL_VARCHAR.

my $prep = $dbd->prepare($query) or die "ERR: " .$dbd->errstr;

$prep->bind_param( 1, $search_data, { TYPE => SQL_VARCHAR } );

$prep->execute( ) or die 'ERR : '.$prep->errstr;
...