Jakub Nykiel

Jakub Nykiel Specjalista
Informatyk,
Wodociągi Płockie
Sp. z o.o.

Temat: Mysql i UTF8

Witam,

Czy może mi ktoś wytłumaczyć o co kaman?
Wyeksportowałem bazę mysql na serwer. W pliku mam DEFAULT CHARSET=utf8
Niestety na stronie na której też jest UTF8 ustawione jako kodowanie polskich znaków pokazują się krzaczki. Dopiero jak w przeglądarce zmienię kodowanie na Windows-1250 to polskie znaki się pokazują.
Nie rozumiem tego!
Andrzej Prażmo

Andrzej Prażmo programista .NET,
właściciel firmy SEE
Software

Temat: Mysql i UTF8

Słowo klucz, to "wyeksportowałem". Jak rozumiem, robiłeś to przez mysqldump. Jeśli tak, to czy do tego polecenia dodałeś stosowny switch odnośnie kodowania?

Temat: Mysql i UTF8

Sprawdz:
- kodowanie bazy ktora eksportujesz,
- kodowanie kolumn / tabel w tej bazie,
- kodowanie pliku ze zrzutem bazy (mysqldump),
- kodowanie bazy do ktorej importujesz,
- kodowanie strony na ktorej bedziesz wyswietlal zawartosc importowanej bazy (jesli bedziesz).

Dla bazy danych powinno to byc utf8-general-ci...

Jesli wszedzie bedzie utf-8 (a takie powinno byc) to nie ma mozliwosci abys mial problemy.

konto usunięte

Temat: Mysql i UTF8

Mateusz Komarnicki:
Dla bazy danych powinno to byc utf8-general-ci...

Właśnie z tym ustawieniem to i ja miałem kiedyś problemy. Znaki były wyświetlane nieprawidłowo.

Ale jak się okazało, wystarczyło ustawić nie utf-8-general.ci ale utf-8-polish.ci

Może właśnie to rozwiąże problem...

Temat: Mysql i UTF8

Jakub Nykiel:
Witam,

Czy może mi ktoś wytłumaczyć o co kaman?
Wyeksportowałem bazę mysql na serwer. W pliku mam DEFAULT CHARSET=utf8
Niestety na stronie na której też jest UTF8 ustawione jako kodowanie polskich znaków pokazują się krzaczki. Dopiero jak w przeglądarce zmienię kodowanie na Windows-1250 to polskie znaki się pokazują.
Nie rozumiem tego!

Ja nie rozumiem tego, co napisałeś. A napisałeś, że:

1. wyeksportowałeś JAKĄŚ bazę mysql (z "niewiadomojakim" kodowaniem i nie wiadomo jak eksportowałeś) na JAKIŚ serwer
2. W JAKIMŚ pliku (no dobra, tu się można domyślić ;-)) masz ustawione utf-8.
3. JAKAŚ strona pokazuje coś w JAKIEJŚ przeglądarce,
4. zmiana kodowania na Win1250 powoduje, że ta JAKAŚ strona pokazuje dobrze polskie znaki (wcześniej określone kodowaniem utf-8)

Jak ta strona pokazuje te znaki? To jakieś php pobierające dane z bazy? Co jest w nagłówkach serwisu? Jak pobierane są dane z bazy? Czy może w przeglądarce oglądasz czystego dumpa z bazy?

Generalnie: opisz dokładniej problem podając więcej danych, bo na razie to można domniemywać że baza jest w utf-8 a serwis WWW pokazujący dane (pobierane z bazy, konwertuje z utf-8 na win1250) - Win1250 ;-)

Temat: Mysql i UTF8

Dariusz Rorat:
Mateusz Komarnicki:
Dla bazy danych powinno to byc utf8-general-ci...

Właśnie z tym ustawieniem to i ja miałem kiedyś problemy. Znaki były wyświetlane nieprawidłowo.

Ale jak się okazało, wystarczyło ustawić nie utf-8-general.ci ale utf-8-polish.ci

Może właśnie to rozwiąże problem...

Polish.ci sprawi, ze mozesz miec problemy z sortowaniem. Ł bedzie po Z itp. Generalnie jesli wszystko jest w UTF (bez wzgledu na general, spanish, polish czy jakiekolwiek inne) to nie powinno byc problemu z krzakami. Jeszcze jedna kwestia. Jesli masz krzaki to jeszcze pol biedy - jesli masz znaki zapytania to dane masz fizycznie pozamiatane.

Dla pewnosci jeszcze mozesz dorzucic set namesy (wziete z przykladu php):


mysql_query('set character set utf8', $connect);
mysql_query('set names utf8', $connect);
Jakub Nykiel

Jakub Nykiel Specjalista
Informatyk,
Wodociągi Płockie
Sp. z o.o.

Temat: Mysql i UTF8

Tak w dużym skrócie zrobiłem tak:
zdumpowałem bazę z jednego serwera, niestety otrzymałem plik w którym nie było polskich znaków, ale nie za bardzo mogłem dojść do tego jakie to było kodowanie bo różne konwersje przy użyciu iconv nie dawały poprawnych rezultatów. W pliku było niby latin1. Więc zrobiłem tak:

sed -e 's/latin1/utf8/g' -i baza.sql
sed -e 's/³/ł/g' -i baza.sql
sed -e 's/ê/ę/g' -i baza.sql
sed -e 's/ñ/ń/g' -i baza.sql
sed -e 's/¹/ą/g' -i baza.sql
sed -e 's/æ/ć/g' -i baza.sql
sed -e 's/¿/ż/g' -i baza.sql
sed -e 's/£/Ł/g' -i baza.sql
sed -e 's/Œ/Ś/g' -i baza.sql
sed -e 's/œ/ś/g' -i baza.sql
sed -e 's/¯/Ż/g' -i baza.sql
sed -e 's/Ÿ/ź/g' -i baza.sql

następnie wrzuciłem to na nowy serwer.
Robiłem tak wcześniej tyle że bazę wrzucałem na inny serwer stawiany przez siebie i było OK. Teraz wrzucam to na home.pl i mam problem.
Na serwerze jest tak: Kodowanie znaków serwera: UTF-8 Unicode (utf8)
Sortowanie połączenie z serwerem: utf8_general.ci

Nie bardzo mogę się teraz rozpisywać na ten temat ale może te kilka informacji coś pomoże.

Pozdr.
Kuba

konto usunięte

Temat: Mysql i UTF8

Jakub Nykiel:
Tak w dużym skrócie zrobiłem tak:
zdumpowałem bazę z jednego serwera, niestety otrzymałem plik w którym nie było polskich znaków, ale nie za bardzo mogłem dojść do tego jakie to było kodowanie bo różne konwersje przy użyciu iconv nie dawały poprawnych rezultatów. W pliku było niby latin1.

Zakładam, że jesteś pewien iż baza.sql jest w latin1. Jeśli nie jesteś to sprawdź to i sprawdź tez jakim kodowaniem posługujesz się robiąc dumpa - my.ini sekcja [dump]. Możesz zapisywać bazę kodowaną w XXX w pliku kodowanym YYYY - stąd krzaki.

iconv -f latin1 -t UTF8 < baza.sql > bazautf8.sqlSebastian Zaborowski edytował(a) ten post dnia 31.10.12 o godzinie 22:20
Jakub Nykiel

Jakub Nykiel Specjalista
Informatyk,
Wodociągi Płockie
Sp. z o.o.

Temat: Mysql i UTF8

Nie miałem czasu na to ale nadeszła pora aby wrócić do tematu.
Nie nie jestem pewien ze baza jest w latin1 a nawet chyba jestem pewien, że nie jest.
Jak zatem można sprawdzić w jakim jest kodowaniu?

Z tego co widzę w my.cnf

[mysqld]
basedir=C:/Program Files/WebServ2/mysql
#bind-address=
datadir=C:/Program Files/WebServ2/mysql/data
language=C:/Program Files/WebServ2/mysql/share/polish
#slow query log#=
tmpdir=C:/Program Files/WebServ2/temp
port=3306
#set-variable=key_buffer=16M
character-set-server=latin2
default-character-set=latin2

To baza jest w latin2, nie ma sekcji [dump]
Gdy próbuję ją przekonwertować z latin2 na utf8
iconv -f latin2 -t UTF-8 dump.sql > dump_utf8.sql

dostaję jako rezultat coś takiego:

-- MySQL dump 10.11
--
-- Host: localhost Database: patomorfologia
-- ------------------------------------------------------
-- Server version 5.0.45-community-nt

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES UTF8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `badania`
--

DROP TABLE IF EXISTS `badania`;
CREATE TABLE `badania` (
`id` int(11) NOT NULL auto_increment,
`nazwa_badania` varchar(100) NOT NULL default '',
`cena` double NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=latin1;

--
-- Dumping data for table `badania`
--

LOCK TABLES `badania` WRITE;
/*!40000 ALTER TABLE `badania` DISABLE KEYS */;
INSERT INTO `badania` VALUES (1,'szczoteczki',0),(2,'P³yny z jam cia³a',0),(3,'Cytologia moczu',0),(4,'Badanie sekcyjne',0),(5,'PCI torbieli',0),(6,'PCI patolog',0),(7,'Cyt. ginekologiczna',0),(8,'cyt. plwociny',0),(9,'Pop³uczyny',0),(10,'Histopatologiczne',0),(11,'Œródoperacyjne',0),(12,'Immunohistochemia',0),(13,'receptor estrogen.',0),(14,'PCI guza',0);
/*!40000 ALTER TABLE `badania` ENABLE KEYS */;
UNLOCK TABLES;

przed konwersją po dumpie wygląda tak:

DROP TABLE IF EXISTS `badania`;
CREATE TABLE `badania` (
`id` int(11) NOT NULL auto_increment,
`nazwa_badania` varchar(100) NOT NULL default '',
`cena` double NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=15 DEFAULT CHARSET=latin1;

--
-- Dumping data for table `badania`
--

LOCK TABLES `badania` WRITE;
/*!40000 ALTER TABLE `badania` DISABLE KEYS */;
INSERT INTO `badania` VALUES (1,'szczoteczki',0),(2,'P³yny z jam cia³a',0),(3,'Cytologia moczu',0),(4,'Badanie sekcyjne',0),(5,'PCI torbieli',0),(6,'PCI patolog',0),(7,'Cyt. ginekologiczna',0),(8,'cyt. plwociny',0),(9,'Pop³uczyny',0),(10,'Histopatologiczne',0),(11,'Œródoperacyjne',0),(12,'Immunohistochemia',0),(13,'receptor estrogen.',0),(14,'PCI guza',0);
/*!40000 ALTER TABLE `badania` ENABLE KEYS */;
UNLOCK TABLES;

przy dumpowaniu dałem --defaul-character-set=UTF8
Nie wiem czy to może mieć jakiś wpływ ale pliki oglądam pod linuxem przy użyciu gedit.

pozdr.
JN

Sebastian Zaborowski:
Jakub Nykiel:
Tak w dużym skrócie zrobiłem tak:
zdumpowałem bazę z jednego serwera, niestety otrzymałem plik w którym nie było polskich znaków, ale nie za bardzo mogłem dojść do tego jakie to było kodowanie bo różne konwersje przy użyciu iconv nie dawały poprawnych rezultatów. W pliku było niby latin1.

Zakładam, że jesteś pewien iż baza.sql jest w latin1. Jeśli nie jesteś to sprawdź to i sprawdź tez jakim kodowaniem posługujesz się robiąc dumpa - my.ini sekcja [dump]. Możesz zapisywać bazę kodowaną w XXX w pliku kodowanym YYYY - stąd krzaki.

iconv -f latin1 -t UTF8 < baza.sql > bazautf8.sqlJakub Nykiel edytował(a) ten post dnia 09.11.12 o godzinie 13:26
Jakub Nykiel

Jakub Nykiel Specjalista
Informatyk,
Wodociągi Płockie
Sp. z o.o.

Temat: Mysql i UTF8

Mateusz Komarnicki:

mysql_query('set character set utf8', $connect);
mysql_query('set names utf8', $connect);
to zadziałało...

konto usunięte

Temat: Mysql i UTF8

półśrodek, ale jednak

Temat: Mysql i UTF8

Niby tak - set names narzuca kodowanie klientowi - jak nie chcemy polsrodkow to dostosujmy my.cnf do indywidualnych potrzeb i /etc/init.d/mysqld restart...

konto usunięte

Temat: Mysql i UTF8

Mateusz Komarnicki:
Niby tak - set names narzuca kodowanie klientowi - jak nie chcemy polsrodkow to dostosujmy my.cnf do indywidualnych potrzeb i /etc/init.d/mysqld restart...

Jeszcze większa rzeźba. Po prostu trzeba przekonwertować dane lub trzymać je we właściwym kodowaniu. Teraz tekst zakodowany w latin2 (albo innym) jest zakodowany w UTF-8.
Jakub Nykiel

Jakub Nykiel Specjalista
Informatyk,
Wodociągi Płockie
Sp. z o.o.

Temat: Mysql i UTF8

Sebastian Zaborowski:
Mateusz Komarnicki:
Niby tak - set names narzuca kodowanie klientowi - jak nie chcemy polsrodkow to dostosujmy my.cnf do indywidualnych potrzeb i /etc/init.d/mysqld restart...

Jeszcze większa rzeźba. Po prostu trzeba przekonwertować dane lub trzymać je we właściwym kodowaniu. Teraz tekst zakodowany w latin2 (albo innym) jest zakodowany w UTF-8.

zgadzam się, przy takim rozwiązaniu jest problem np. z sortowaniem.
Zastanawiam się, skoro set names narzuca klientowi kodowanie i polskie znaki są wyświetlane poprawnie jak w takim układzie przekonwertować bazę do postaci prawidłowej?

Po przez mysqldump za cholerę nie mogę tego zrobić, przy kombinacji --default-character-set=latin1, latin2, cp1250 cały czas dostaję krzaki w pliku z dumpem. iconv też tego nie rusza.

Do bazy dane zapisuje program napisany w vb6 z pod windows'a - domyślam się że kodowanie może być cp1250 a to zapisuje się do bazy kodowanej w latin2 Jakub Nykiel edytował(a) ten post dnia 02.12.12 o godzinie 19:45

konto usunięte

Temat: Mysql i UTF8

Jakub Nykiel:
Do bazy dane zapisuje program napisany w vb6 z pod windows'a - domyślam się że kodowanie może być cp1250 a to zapisuje się do bazy kodowanej w latin2

kodowanie może być dowolne, definiujesz je na poziomie connection stringa
Jakub Nykiel

Jakub Nykiel Specjalista
Informatyk,
Wodociągi Płockie
Sp. z o.o.

Temat: Mysql i UTF8

Przemysław R.:
Jakub Nykiel:
Do bazy dane zapisuje program napisany w vb6 z pod windows'a - domyślam się że kodowanie może być cp1250 a to zapisuje się do bazy kodowanej w latin2

kodowanie może być dowolne, definiujesz je na poziomie connection stringa
skoro kodowanie na stronie jest teraz OK to nic już nie robić z tymi danymi które są w bazie?

Następna dyskusja:

Zapytanie MySQL




Wyślij zaproszenie do