2008-12-30 8 views
0

J'ai un script Perl s'exécutant sous UNIX qui utilise DBI pour se connecter et récupérer des données à partir d'une base de données SQL Server. Le script se présente comme suit:Comment puis-je gérer les caractères non ASCII lors de la récupération de données à partir de SQL Server à l'aide de Perl?

$dbh = DBI->connect("dbi:Sybase:server=$connect;charset=UTF-8", $login, $password) or die("Couldn't connect to $connect as $login/$password: 
$DBI::errstr"); 


$sql = "use mydb"; 
$sth = $dbh->prepare($sql); 
$sth->execute or die("execute failed"); 
$sth->finish; 


$sql = "MyProc \@DATE='1/1/2008'"; 
$sth = $dbh->prepare($sql); 
$sth->execute or die("execute failed"); 
while (($body) = $sth->fetchrow()) { 
     print "$body\n"; 
} 
$sth->finish; 

$dbh->disconnect if $dbh; 

La variable corps récupère les données à partir d'une colonne qui est NVARCHAR et contient des caractères non-ASCII. La requête fonctionne bien, mais l'instruction d'impression crache ????? quand il rencontre un caractère non-ASCII. Dans DBI-> connect je précise même le jeu de caractères, mais pas de chance.

Avez-vous des idées sur la façon dont je peux faire fonctionner cela?

Répondre

0

J'ai connecté Perl à SQL Server via FreeTDS + ODBC et n'ai eu aucun problème avec les encodages de caractères. Peut-être que le Sybase DBI est le coupable ici ...

6

Votre code semble OK.

Je n'ai aucune raison de croire que ce que vous mettez dans la base de données et récupérez par la suite n'est pas encore encodé en UTF-8. Avez-vous confirmé que le terminal sur lequel vous imprimez les données est en mode UTF-8?

+0

Je suis un unix noob - pouvez-vous expliquer comment je peux confirmer que mon terminal est en UTF-8 et comment je peux le mettre à jour? – adeel825

+0

votre environnement doit être défini (par exemple, setenv LANG en_US.UTF-8 si vous utilisez "csh") et votre logiciel de terminal doit être défini. Cela dépend du logiciel que vous utilisez. – Alnitak

2

Oh combien d'heures j'ai gaspillé chassant les bogues inexistants basés sur ce que j'ai vu ou n'ai pas vu quand j'ai imprimé des données à mon terminal. Il existe plusieurs façons de vérifier vos données qui ne sont pas affectées par des caractères non imprimables et qui ne dépendent pas de l'affichage de votre système par les glyphes corrects aux codes de caractères non ASCII. Si vos données ne semblent pas correctes, placez-les dans un fichier et parcourez le fichier avec un éditeur hexadécimal ou exécutez-les via l'utilitaire od.