Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

select, if vs utf-8

[es] :: MySQL :: select, if vs utf-8

Strane: 1 2

[ Pregleda: 3895 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

karas

Član broj: 5574
Poruke: 482
*.COOL.ADSL.VLine.Verat.NET.



+1 Profil

icon select, if vs utf-825.06.2010. u 16:08 - pre 168 meseci
Pojavljuje se jedan zanimljiv problem kada je tabela u UTF8 formatu a koristi se SELECT u kombinaciji sa IF-om.

Naime, neka je tabela definisana sa
Code (sql):

CREATE TABLE person
(
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(16)
) DEFAULT CHARSET="utf8"
 

i neka je ubacen red
Code (sql):

INSERT INTO person(name) VALUES('Petrović')
 

Sledeci upit kada se poziva iz skripta ne vraca UTF8 vec ASCII:
Code (sql):

SELECT IF(name != '', name, id) FROM person
 

Ako se kastuje id u IF-u, onda vraca UTF8 kao sto je i ocekivano
Code (sql):

SELECT IF(name != '', name, CAST(id AS CHAR(4))) FROM person
 

Upit
Code (sql):

SELECT name FROM person
 

naravno vraca UTF8.
Svi upiti se izvrsavaju iz Perl i Python skriptova, jos nisam probao kako radi iz C-a. Pri tome, poslednja grana u IF uopste se ne izvrsava jer name svakako nije prazan string!
Da li je problem u SQL-u odn. kolacijama/enkodingu, C klijent biblioteci koju Perl i Python drajveri obmotavaju ili nesto trece? Verzije MySQL-a na kojima sam isprobao su MySQL 5.1.41 i 5.1.38 64bit.
Evo i celog Perl koda koji ilustruje problem.
Code (perl):

#!/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";
}
 

Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: select, if vs utf-825.06.2010. u 18:52 - pre 168 meseci
u kojoj verziji ti se to desava ?!

ja sam sad probao u 5.1.41 i radi normalno:

Code:

create table t4 (
id int not null auto_increment primary key,
name varchar(200)
) default charset="utf8" engine=myisam;

insert into t4 (name) values ('đšđšćđšđščćč'), ('š1đđđšđž'), ('ćčćšđ'), 
('đđššččččč'), ('ššššđđđđ'), ('đšđšđšđšđšđšđšđ'), ('žžžšššžšžšžšž'),
('đšđšžžžšžšžšž'), ('žžžžžžžžž'), ('ššššššššščččć');

mysql> mysql> select * from t4;
+----+--------------------------------+
| id | name                           |
+----+--------------------------------+
|  1 | đšđšćđšđščćč       |
|  2 | š1đđđšđž                |
|  3 | ćčćšđ                     |
|  4 | đđššččččč             |
|  5 | ššššđđđđ               |
|  6 | đšđšđšđšđšđšđšđ |
|  7 | žžžšššžšžšžšž     |
|  8 | đšđšžžžšžšžšž     |
|  9 | žžžžžžžžž             |
| 10 | ššššššššščččć     |
+----+--------------------------------+
10 rows in set (0.00 sec)


dakle setup je kao sto si ti napisao i sada upit ...

Code:

mysql> select if (name != '', name, id) from t4;
+--------------------------------+
| if (name != '', name, id)      |
+--------------------------------+
| đšđšćđšđščćč       |
| š1đđđšđž                |
| ćčćšđ                     |
| đđššččččč             |
| ššššđđđđ               |
| đšđšđšđšđšđšđšđ |
| žžžšššžšžšžšž     |
| đšđšžžžšžšžšž     |
| žžžžžžžžž             |
| ššššššššščččć     |
+--------------------------------+
10 rows in set (0.00 sec)

mysql> select if (id < 5, name, id) from t4;
+--------------------------+
| if (id < 5, name, id)    |
+--------------------------+
| đšđšćđšđščćč |
| š1đđđšđž          |
| ćčćšđ               |
| đđššččččč       |
| 5                        |
| 6                        |
| 7                        |
| 8                        |
| 9                        |
| 10                       |
+--------------------------+
10 rows in set (0.00 sec)

kao sto vidis, sve sljaka kao sto je ocekivano ?!

python ocima ne mogu da vidim a sto se perla tice postoji sansa da ovaj PREPARE statement u perlu ne radi kako treba:

Code:

$sth = $dbh->prepare("SELECT IF(name != '', name, id) FROM person");


ali to je onda bag do perla, ne do mysql-a, probaj da uradis select bez prepare ..

 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: select, if vs utf-826.06.2010. u 11:14 - pre 168 meseci
Meni je Python bio lep u početku, ali toliko toga menjaju iz verzije u verziju, da je i prosto prebacivanje XML-RPC servera sa Python 2.2 na Python 2.4 bilo poprilično mučenje zbog izmena u standardnoj biblioteci. Tako sam shvatio da mogu da trpim Perlovu ružnoću ako će sve da radi.:)

Elem, kod kuće koristim MySQL 5.0.84 i 5.1.41 na Slackware 13 64bit i isprobavam naša slova, a u firmi se koristi MySQL 5.1.38 na CentOS5 64bit i mahom su skandinavska slova. Svuda imam opisani problem.

Ako ostavim kreiranje i punjenje tabele kao u Perl primeru a isprobam samo čitanje iz C-a i dalje imam isti problem:
Code (c):

/*
     gcc -I/usr/local/mysql-5.1.41/include/ -L/usr/local/mysql-5.1.41/lib -lmysqlclient -otest test.c
*/



#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>


int main()
{
     char* sql;
     int status;
     MYSQL* connection;
     MYSQL_ROW row;
     MYSQL_RES* result;

     status = mysql_library_init(0, NULL, NULL);
     if (status != 0)
     {
          fprintf(stderr, "cannot initialize MySQL library!\n");
          mysql_close(connection);
          mysql_library_end();
          exit(EXIT_FAILURE);
     }
     
     connection = mysql_init(NULL);
     connection = mysql_real_connect(connection, "localhost", "karas", "", "test", 3306, NULL, 0);
     if (connection == NULL)
     {
          fprintf(stderr, "cannot connect to database!\n");
          mysql_close(connection);
          mysql_library_end();
          exit(EXIT_FAILURE);
     }

     sql = "SELECT IF(name != '', name, id) FROM person";
     status = mysql_query(connection, sql);
     if (status != 0)
          fprintf(stderr, "cannot select from 'person' table!\n");
     else
     {
          result = mysql_store_result(connection);
          if (result == NULL)
               fprintf(stderr, "cannot store result!\n");
          while (row = mysql_fetch_row(result))
               printf("%s\n", row[0]);
          mysql_free_result(result);
     }

     mysql_close(connection);
     mysql_library_end();

     return EXIT_SUCCESS;
}
 

Zatim uradim ./test > log.txt i sadržaj fajla log.txt u UTF8 enkodingu je
Code:

Petrović

Koliko razumem stvar, ja UTF8 ne dobijam u slučaju sa
Code:

SELECT IF(name != '', name, id) FROM person

koristio Perl ili C, dok
Code:

SELECT IF(name != '', name, CAST(id AS CHAR(4))) FROM person

radi i sa Perlom i sa C-om na kućnoj mašini.

Na poslu je isti problem ali sa Pythonom. Zato sam i uzeo da probam Perl i C, jer nisam bio siguran da li su u pitanju Python drajveri ili nešto drugo. Ako imam isti problem i u Perlu i u C-u, onda mi to liči na problem sa mysqlclient bibliotekom, jer mislim da Perl i Python samo pozivaju izvornu C biblioteku.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: select, if vs utf-826.06.2010. u 13:59 - pre 168 meseci
u c primeru nisi setovao enkoding konekcije?

kada uradis:

Code:

#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>


int main()
{
     char* sql;
     int status;
     MYSQL* connection;
     MYSQL_ROW row;
     MYSQL_RES* result;

     status = mysql_library_init(0, NULL, NULL);
     if (status != 0)
     {
          fprintf(stderr, "cannot initialize MySQL library!\n");
          mysql_close(connection);
          mysql_library_end();
          exit(EXIT_FAILURE);
     }

     connection = mysql_init(NULL);
     connection = mysql_real_connect(connection, "localhost", "root", "", "test", 3306, NULL, 0);
     if (connection == NULL)
     {
          fprintf(stderr, "cannot connect to database!\n");
          mysql_close(connection);
          mysql_library_end();
          exit(EXIT_FAILURE);
     }

     if (!mysql_set_character_set(connection, "utf8"))
     {
        printf("New client character set: %s\n",
           mysql_character_set_name(connection));
     }


     sql = "SELECT IF(name != '', name, id) FROM t4";
     status = mysql_query(connection, sql);
     if (status != 0)
          fprintf(stderr, "cannot select from 'person' table!\n");
     else
     {
          result = mysql_store_result(connection);
          if (result == NULL)
               fprintf(stderr, "cannot store result!\n");
          while (row = mysql_fetch_row(result))
               printf("%s\n", row[0]);
          mysql_free_result(result);
     }

     mysql_close(connection);
     mysql_library_end();

     return EXIT_SUCCESS;
}


sve radi kako treba, aj probaj ovako .. (jedina izmena u odnosu na tvoj primer je ime tabele (kod mene se zove t4) i xo sam dodao mysql_set_character_set(connection, "utf8")
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: select, if vs utf-826.06.2010. u 21:13 - pre 168 meseci
Ma kakvi, dobijam kao rezultat
Code:

New client character set: utf8
Petrović

Probao sam da podignem server sa
Code:

cd /usr/local/mysql-5.1.41/
./bin/mysqld_safe&

i tada imam
Code:

mysql> show variables like '%char%';
+--------------------------+-----------------------------------------+
| Variable_name            | Value                                   |
+--------------------------+-----------------------------------------+
| character_set_client     | latin1                                  | 
| character_set_connection | latin1                                  | 
| character_set_database   | latin1                                  | 
| character_set_filesystem | binary                                  | 
| character_set_results    | latin1                                  | 
| character_set_server     | latin1                                  | 
| character_set_system     | utf8                                    | 
| character_sets_dir       | /usr/local/mysql-5.1.41/share/charsets/ | 
+--------------------------+-----------------------------------------+

a probao sam i sa
Code:

cd /usr/local/mysql-5.1.41/
./bin/mysqld_safe --character-set-server=utf8 &

i tada imam
Code:

mysql> show variables like '%char%';
+--------------------------+-----------------------------------------+
| Variable_name            | Value                                   |
+--------------------------+-----------------------------------------+
| character_set_client     | latin1                                  | 
| character_set_connection | latin1                                  | 
| character_set_database   | utf8                                    | 
| character_set_filesystem | binary                                  | 
| character_set_results    | latin1                                  | 
| character_set_server     | utf8                                    | 
| character_set_system     | utf8                                    | 
| character_sets_dir       | /usr/local/mysql-5.1.41/share/charsets/ | 
+--------------------------+-----------------------------------------+

ali isti je rezultat u oba slučaja.

Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.dynamic.sbb.rs.



+1 Profil

icon Re: select, if vs utf-826.06.2010. u 21:59 - pre 168 meseci
Pazi kad fercera ako koristim Qt:
Code (cpp):

/*
qmake -project
qmake
make
*/



#include <QtSql>
#include <iostream>


using namespace std;


int main()
{
     QSqlDatabase connection = QSqlDatabase::addDatabase("QMYSQL");
     connection.setHostName("localhost");
     connection.setPort(3306);
     connection.setDatabaseName("test");
     connection.setUserName("karas");
     if (!connection.open())
     {
          cerr << "cannot connect to database!" << connection.lastError().text().toStdString() << endl;
          exit(EXIT_FAILURE);
     }
     
     QSqlQuery query(connection);
     
     if (!query.exec("DROP TABLE IF EXISTS person"))
          cerr << "cannot drop table!" << endl;
     
     if (!query.exec("CREATE TABLE person(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(16)) DEFAULT CHARSET=\"utf8\" ENGINE=myisam"))
          cerr << "cannot create table!" << endl;

     if (!query.exec(QString("INSERT INTO person(name) VALUES('Petrovi") + QChar(0x107) + "')"))
          cerr << "cannot insert into table!" << endl;

     if (query.exec("SELECT IF(name != '', name, id) FROM person WHERE id = 1"))
     {
          if (query.first())
               cout << query.value(0).toString().toStdString();
     }
     else
          cerr << "cannot execute query!" << endl;
     
     return EXIT_SUCCESS;
}
 

Sta sad to Qt radi sto C ne radi!? I zasto kastovanje utice na UTF8 rezultat kod Perla/Pythona/C-a?
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: select, if vs utf-827.06.2010. u 11:28 - pre 168 meseci
radi ti i C .. vidis da ti je vratio 2 bajta za ć. to sto tvoj shell ne ume da prikaze utf8 karakter je druga prica (zato ti qt radi, zato sto ume da prikaze utf)... za python (2.2 ne znam za posle) znam da nema podrsku za utf, za perl linisam siguran a za c nativno znam da ne podrzava tako da ti dobijes od mysql-a regularno formiran utf (dakle ć je dva bajta) - sada to prikazati je druga prica - qt to ume, ume i shell ako mu kazes :)

sve u svemu, u prvom primeru ti je problem sto nisi setovao enkoding konekcije, u drugom primeru ti je problem sto ne umes da prikazes to sto si dobio
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.opera-mini.net.



+1 Profil

icon Re: select, if vs utf-827.06.2010. u 13:21 - pre 168 meseci
Oba programcica, C i Qt, rade u terminalu. Njihov izlaz preusmerim u fajl. Taj fajl otvorim iz npr. KWrite i stavim enkoding UTF8. U Qt slucaju dobijem nase 'c', dok u C slucaju ne dobijem. Zasto, kad oba rade u terminalu? I zasto se to ne desava sa C-om ako ubacim kastovanje u SQL, kako to utice na enkoding?
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.opera-mini.net.



+1 Profil

icon Re: select, if vs utf-827.06.2010. u 13:24 - pre 168 meseci
Oba programcica, C i Qt, rade u terminalu. Njihov izlaz preusmerim u fajl. Taj fajl otvorim iz npr. KWrite i stavim enkoding UTF8. U Qt slucaju dobijem nase 'c', dok u C slucaju ne dobijem. Zasto, kad oba rade u terminalu? I zasto se to ne desava sa C-om ako ubacim kastovanje u SQL, kako to utice na enkoding?
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

vlada_vlada
Uber
Beograd

Član broj: 259596
Poruke: 68
*.dynamic.sbb.rs.



+7 Profil

icon Re: select, if vs utf-827.06.2010. u 15:24 - pre 168 meseci
Koliko je veliki fajl koji generise C program, a koliko kada ga napravi Qt? Mozes li napraviti binarni dump fajlova i okaciti ovde (od --help).

Da li si pokusao da umesto Perl/Python/C API-ja koristis mysqlclient, kao sto je Bogdan pokazao u prvom postu ?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: select, if vs utf-827.06.2010. u 19:07 - pre 168 meseci
nesto lose radis - video si da sam uzeo TVOJ C fajl, dodao mu enkoding i vrati omi je utf .. nema tu velike pameti .. C ce da dobije za to 2 bajta (kao sto je i DOBIO u primeru za koji si ti rekao "ma kakvi" - imas dva bajta i to jeste to slovo - samo tvoj terminal ne ume da ga prikaze, C - ne ume da radi sa unikodom etc etc ..)

default setovani enkoding na mysql-u je nebitan - ti moras da setujes enkoding iz tvoje aplikacije

kastovanje utice na to kako ce "prepare" da odradi posao ... python i perl ocigledno ne umeju da urade prepare kako treba pa ih taj if zbuni .. C ne pravi problem - pokazao sam ti ..

daj mi C kod koji ti ne radi (upisi direktno izlaz u fajl, nemoj da ga pises na ekran uopste) da probam, ovo sto si do sada pokazao da "ne radi" - radi !! (bez qt-a, pythona, perla etc... dakle cist C posto kazes da ti to ne radi)
 
Odgovor na temu

vlada_vlada
Uber
Beograd

Član broj: 259596
Poruke: 68
*.dynamic.sbb.rs.



+7 Profil

icon Re: select, if vs utf-828.06.2010. u 09:26 - pre 168 meseci
@bogdan.kecman:

Definitivno dolazi do nekog konvertovanja enkodinga. Posto to nisu ta dva bajta - u ovom strigu: "Petrović", poslednja dva karaktera su "\x8d\xe7" - sto je invalidni karakter u UTF8 enkodingu.

Elem bilo bi dobro videti kako tacno izgledaju fajlovi koji se generisu redirekcijom. Jos bolje bi bilo kada bi se uradio upis stringa u binarni fajl direktno iz C-a - kako bi izbegle transformacije koje terminal izvodi nad stdout stream-om.

To sto ne mozemo bug da reprodukujemo kod sebe, ne znaci da ne postoji.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: select, if vs utf-828.06.2010. u 12:41 - pre 168 meseci
vlada_vlada, to mu je iskonvertovao njegov terminal ili tako nesto, posto ako je stavio enkoding za konekciju i u mysql-u mu pise prava vrednost, mysql je vratio c-u 2 bajta ..

teoretski je moguce da u startu sadrzaj podataka u bazi ne valja (da je upisan sadrzaj sa pogresnim enkodingom)

Citat:
To sto ne mozemo bug da reprodukujemo kod sebe, ne znaci da ne postoji.


oh ne, nista ne znaci 100% ali u 99.99% clucajeva to kada ja tako prost bag ne mogu da reprodukujem na slicnoj platformi znaci da nije u pitanju bag vec greska izmedju monitora i stolice



 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.COOL.ADSL.VLine.Verat.NET.



+1 Profil

icon Re: select, if vs utf-828.06.2010. u 13:04 - pre 168 meseci
Ne bih rekao da je terminal, sve vreme radim redirekciju izlaza u fajl log.txt.

Problem je u sledecem: kreiranje i punjenje baze sam uradio u Perlu, i to sto je Perl upisao izgleda nije UTF8. Citanje sam probao iz Perla, i nisam dobijao nase slovo, pa sam probao da procitam iz C-a, ali ni to nije radilo, jer je Perl zabrljao prilikom insert-a. Medjutim, ako uradim kreiranje i punjenje baze iz C++/Qt gde nase slovo upisujem kao QChar(0x107), onda se upise UTF8 karakter, i citanje radi iz C-a bas kako treba.

Dakle, Perl mi je napravio problem, verovatno ne prevodi pravilno fajlove sa izvornim kodom koji sadrze UTF8 znakove. Ali i dalje mi je potpuna misterija zasto
Code (sql):

SELECT IF(name != '', name, CAST(id AS CHAR(4))) FROM person
 

kada se uradi iz Perla uradi konverziju u UTF8 (barem log.txt sadrzi "ć").
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: select, if vs utf-828.06.2010. u 13:26 - pre 168 meseci
a ne radim mnogo u perlu i nisam nikad probao utf u istom . tako da ne mogu mnogo tu da ti pomognem ...

evo ovako uradi sledece (pretpostavljam da imas db test, ovo ce ti kreirati i napuniti tabelu t4 kako treba) na test mysql serveru iz shell-a (dump.sql.bz2 ti je attachovan ovde):

Code:

bzcat dump.sql.bz2 | mysql test


imas onaj moj primer u c-u (prepravljen tvoj), i pusti ga nad tom bazom (test.t4) i vidi sta ces da dobijes nazad ..

ovim izbacujes varijantu da ti se u bazi ne nalazi ok sadrzaj, ovaj dump ce ti napuniti tabelu t4 sa validnim sadrzajem

pusti nad istom tom tabelom jos koji primer ako hoces:

Code:

[arhimed@gedora10 ~]$ php
<?php
mysql_connect(":/tmp/mysql.sock", "root", "");
mysql_select_db("test");
mysql_query("set names 'utf8'");
$res=mysql_query("SELECT IF(name != '', name, id) FROM t4");
while($row=mysql_fetch_array($res)) echo $row[0]."\n";
mysql_free_result($res);
mysql_close();
?>
đšđšćđšđščćč
š1đđđšđž
ćčćšđ
đđššččččč
ššššđđđđ
đšđšđšđšđšđšđšđ
žžžšššžšžšžšž
đšđšžžžšžšžšž
žžžžžžžžž
ššššššššščččć
[arhimed@gedora10 ~]$


(posle ?> stisnes enter pa CTRL+D)


Prikačeni fajlovi
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: select, if vs utf-828.06.2010. u 13:40 - pre 168 meseci
btw kad smo kod perla:

Code:

[arhimed@gedora10 Dev]$ cat nj.pl
#!/usr/bin/perl

use DBI;

my $status = undef;

my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost:mysql_socket=/tmp/mysql.sock", "root");
if (!defined($dbh))
{
     printf STDERR "cannot connect to database!\n";
     exit(1);
}

$dbh->do("set names 'utf8'");

$sth = $dbh->prepare("SELECT IF(name != '', name, id) FROM t4");
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";
}[arhimed@gedora10 Dev]$ perl nj.pl
đšđšćđšđščćč
š1đđđšđž
ćčćšđ
đđššččččč
ššššđđđđ
đšđšđšđšđšđšđšđ
žžžšššžšžšžšž
đšđšžžžšžšžšž
žžžžžžžžž
ššššššššščččć
[arhimed@gedora10 Dev]$



 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.COOL.ADSL.VLine.Verat.NET.



+1 Profil

icon Re: select, if vs utf-828.06.2010. u 13:50 - pre 168 meseci
Da, sad je sve u redu sa ovim tvojim dump sadrzajem kada se cita iz C-a i iz Perla. 'Ladno mi Perl ubacuje los karakter u bazu. Ono ispravno citanje iz baze neispravnog karaktera kada se uradi kastovanje mi je potpuno bizarno. Imas ideju zasto to parce SQL-a pretvori neispravan UTF8 znak u ispravan?
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: select, if vs utf-828.06.2010. u 14:04 - pre 168 meseci
nemam pojma sta taj cast uradi ali mislim da ima veze sa tim prepare-om ... generalno kada imas smece u bazi desavaju se razna sra*a ... uvek budi siguran da u bazi imas korektne podatke posto mysql ima podrsku za karatker setove ali slicno kao i za datume, ne proverava da li ti karakteri / datumi imaju smisla
 
Odgovor na temu

karas

Član broj: 5574
Poruke: 482
*.COOL.ADSL.VLine.Verat.NET.



+1 Profil

icon Re: select, if vs utf-828.06.2010. u 14:18 - pre 168 meseci
Ok, hvala puno.
Sveti Avgustin: "Dobar hrišćanin treba da se kloni matematičara i svih onih koji daju lažna proročanstva. Postoji opasnost da su matematičari već sklopili pakt sa Đavolom, da pomrače čovekov um i da ga okuju okovima pakla."
 
Odgovor na temu

Goran Rakić
Beograd

Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: select, if vs utf-828.06.2010. u 14:18 - pre 168 meseci
Ako nisi postavio connection encoding iz Perla na UTF8 pri upisu, nije li normalno da ćeš dobiti smeće u bazi?
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

[es] :: MySQL :: select, if vs utf-8

Strane: 1 2

[ Pregleda: 3895 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.