Salut!
Si une table existe dans un format de UTF8 et on utilise SELECT avec IF, on arrive sur un problème intéressant.
Alors, on définit une table avec
et on ajoute une ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 CREATE TABLE person ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(16) ) DEFAULT CHARSET="utf8"
Si on exécute un requête de Perl ou Python script comme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 INSERT INTO person(name) VALUES('Petrović')
le résultat n'est pas encodé en UTF8 mais en ASCII. Si on exécute le même requête avec IF "cast"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT IF(name != '', name, id) FROM person
on obtient le résultat encodé en UTF8.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT IF(name != '', name, CAST(id AS CHAR(4))) FROM person
Les requêtes sont exécutes par les scripts en Perl et Python, je me suis pas encore les essayés par les exécuter en C.
Est-ce que c'est un problème de SQL (encodage ou "colations" de charsets), un problème de librarie client de C ou quelque autre chose? J'ai utilisé MySQL 5.1.41 et 5.1.38 64bit.
Voilà de code en Perl qui illustre le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 #!/usr/bin/perl use lib "/usr/local/perl5/cpan/DBD-mysql-4.013/lib64/perl5/site_perl/5.10.0/x86_64-linux-thread-multi"; use DBI; my $status = undef; my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost", "karas"); if (!defined($dbh)) { printf STDERR "cannot connect to database!\n"; exit(1); } $status = $dbh->do("DROP TABLE IF EXISTS person"); if (!defined($status)) { printf STDERR "cannot drop 'person' table\n"; } $status = $dbh->do('CREATE TABLE person(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(16)) DEFAULT CHARSET="utf8"'); if (!defined($status)) { printf STDERR "cannot create 'person' table\n"; } $status = $dbh->do("INSERT INTO person(name) VALUES('Petrović')"); if (!defined($status)) { printf STDERR "cannot insert into 'person' table!\n"; } #$sth = $dbh->prepare("SELECT IF(name != '', name, id) FROM person"); #$sth = $dbh->prepare("SELECT name FROM person"); $sth = $dbh->prepare("SELECT IF(name != '', name, CAST(id AS CHAR(4))) FROM person"); if (defined($sth)) { $status = $sth->execute; if (defined($status)) { while (@row = $sth->fetchrow_array) { print "@row\n"; } } else { printf STDERR "cannot execute select for 'person' table!\n"; } } else { printf STDERR "cannot prepare select for 'person' table!\n"; }
Partager