Převod porovnání databáze do utf-8 – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Převod porovnání databáze do utf-8 – MySQL – Fórum – Programujte.comPřevod porovnání databáze do utf-8 – MySQL – Fórum – Programujte.com

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vytvořte si vlastní webové stránky. Snadno, rychle a levně přes Saywebpage.com
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

fix0
Návštěvník
15. 1. 2020   #1
-
0
-

Ahoj všem, prosím o radu.

Do databáze jsem špatným způsobem nahrával data a kvůli tomu mám teď databázi plnou hieroglyfů jako třeba: "DolejÅ¡ Å¡kolení"

Dotaz zní: Jak to opravit převodem hieroglyfů do správného tvaru "Dolejší školení" ideálně přímo databází?

Děkuji všem za tip
 

Nahlásit jako SPAM
IP: 92.240.177.–
gna
~ Anonymní uživatel
1048 příspěvků
16. 1. 2020   #2
-
+1
-
Zajímavé
fix +

Je otázka v jakém stavu tu databázi máš. Jestli jsi tam sypal data v různém kódování a v různém stavu nastavení databáze a/nebo spojení, tak to úplně automaticky nepůjde.

Takže asi napsat skript, který všechna textová pole projde a nějak analyticky je přeformátuje a přeuloží. Nebo třeba databázi/tabulku dumpnout do texťáku, který ručně (hromadně) poopravuješ a naimportuješ zpátky.

Nahlásit jako SPAM
IP: 213.211.51.–
fix0
Návštěvník
16. 1. 2020   #3
-
0
-

Data pořád stejným způsobem.

Klidně to upravím v textáku, už jsem to tak dělal v jednodušším případě, kdy nebylo tolik dat. Nicméně k tomu bych potřeboval s jistotou informaci pro překlad písmen např:

š =Å¡

í =  í

....

Na základě já pak můžu použít třeba jen plošnou funkci nahradit přes celý dokument.

Nahlásit jako SPAM
IP: 31.30.173.–
gna
~ Anonymní uživatel
1048 příspěvků
16. 1. 2020   #4
-
+1
-
Zajímavé
fix +

Co má být co by sis domyslel z kontextu, ale je to teda utf8, akorát interpretované jako (asi) latin1.

Jestli potřebuješ konverzní tabulku, tak si ji můžeš vygenerovat (toto je Python; v PHP asi funkcí iconv) 

>>> for c in 'ěščřžýáíéů':
...     print(c, c.encode(), c.encode().decode('latin1'))
... 
ě b'\xc4\x9b' Ä
š b'\xc5\xa1' Å¡
ř b'\xc5\x99' Å
ž b'\xc5\xbe' ž
ý b'\xc3\xbd' ý
á b'\xc3\xa1' á
í b'\xc3\xad' í
é b'\xc3\xa9' é
ů b'\xc5\xaf' ů
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1048 příspěvků
16. 1. 2020   #5
-
0
-

To ale v případě, že máš tu databázi opravu rozvrtanou. Možná jsi sypal utf8 do sloupců v latin1 (default MySQL) a při konverzi se ti vícebajtové znaky překopaly. Pořád je možnost, že jsou ty texty správně a jen je blbě zobrazuješ.

Nahlásit jako SPAM
IP: 213.211.51.–
peter
~ Anonymní uživatel
3532 příspěvků
17. 1. 2020   #6
-
0
-

Bylo by uplne super, kdybys byl konkretni a napsal, co presne jakymi prikazy si delal a ukazku 2-3 radky zdrojoveho textu.
Obvykla chyba je, ze pri sql dumpu export / import si uzivatel nepohlida default pripojeni pro SET NAMES. Soubor ma utf8. Database muze mit default nastavene latin1. Tabulka v db utf8. On ti to pak prekodovava z utf8 do latin1 a do tabulky to uklada jako latin1. (pro default set names latin1)
V php se pak pripojis k db. Nastavis si utf-8 a database ti z tabulky posle nesmysly.
A nebo to rikam spatne. Ale tak nejak to je :)

Muzes zkusit se podivat na php header() jeste. Pokud mas na obrazovce tyhle znacky a neni tam prohlizec s kodovanim utf, pak by v prohlizeci stacilo prepnout na utf. A nebo v php zasilat ze serveru spravnou header, ze se jedna o utf.
Mozna to rikam nesrozumitelne. Spatne se to popisuje :)
 

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
fix0
Návštěvník
19. 1. 2020   #7
-
0
-

Edit: už jsem to asi našel: https://www.i18nqa.com/…8-debug.html

gna: Děkuji, ještě bych potřeboval ostatní písmena jako třeba ĚŠČŘŽÝÁÍÉÚŮúů

gna #2: No nepoužíval jsem SET NAMES utf8, a je dost možný, že databáze měla skutečně latin1, už se mi to stalo. Při použití set names se data ukládají správně.

pater: možná tě chápu a možná ne jistý si tím nejsem, hlavní je, že vím co dělat (alespoň myslím):

1. převést databázi, tabulky i sloupce na utf8_czech_ci (jinak mi nefungovalo řazení řetězců vč. slov s diakritikou. Někde mám utf8_czech_ci a někde mám utf8m4_czech_ci, výjimečně ještě utf8m4_general_ci a utf8m4_general_ci, snad tohle mixován nijak nevadí a je to navzájem kompatibilní, uvidím, kdyžtak to sjednotím napříč celou databází, pokud to nebude dělat dobrotu

2. Opravit stávají zakodovanou databázi z latin1 -> utf-8


Ä -> ě

Å¡ -> š

...

apod, potřeboval bych zbytek, jinak bych to musel z kontextu dat nějak odhadovat, a luštit, a když to odhadnu špatně, tak už tu databázi do kupy nikdo nedá.

3. Postupně všude přidávat SET NAME před každý SQL dotaz.

Nahlásit jako SPAM
IP: 31.30.173.–
peter
~ Anonymní uživatel
3532 příspěvků
20. 1. 2020   #8
-
0
-

Pokud mas zalohu importovane database, jakoze rozumny clovek si zalohu zalohuje :) Tak podle id se da provest update tech dat, clanku nebo, co to je. Neni treba delat harakiri s diakritikou, kdyz nemusis. To je jistejsi cesta

Nebo by slo udelat script, ktery se k db pripoji pres default kodovani (SET NAMES latin1) ale na stranku to vypise pres header (… utf8). To by melo zobrazit diakritiku asi dobre.
Pokud ano, tak pri updatu zmenis set names na utf8 a nasoukas to tam.
Ale delal bych si to v pokusne db nekde bokem, neprepisovat data, dokud je nemas nekde ve spravnem kodovani.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:3838:5a25:f2e0...–
fix0
Návštěvník
20. 1. 2020   #9
-
0
-

K čemu by mi byla záloha? Když obnovím, zálohu, přijdu akorát o data, nic se tím nezmění, jen těch zakodovaných dat bude o pár záznamů méně.

S tou automatickou opravou to asi myslíš dobře, ale je to docela velký robustní systém, ve kterém mám už sám bordel, není dělaný objektově, spíš mraky skriptů kde jsou třeba u 50 skriptů dotazy na databázi i když vlastně ne nedává mi smysl co mi radíš.

Zopakuji problém:

  • Informace na webu jsou v pořádku
  • Data v databázi jsou ale zakódované
  • Což mi doposud nevadilo, ale teď mi to začalo vadit, protože chci s daty pracovat již přímo v databázi zakodování mi dělá neplechu.
  • Potřebuji tedy opravit data v databázi, aby se v ni data zobrazovaly správně i s diakritikou.

Nahlásit jako SPAM
IP: 31.30.173.–
gna
~ Anonymní uživatel
1048 příspěvků
20. 1. 2020   #10
-
0
-

Dříve nebo později to rozjebeš tak, že přijdeš o data. Záloha ti bude k tomu, abys je mohl obnovit.

Text je vždycky nějak kódovaný a pro správné zobrazení je potřeba vědět jak. Někde ti nastavení nesedí s obsahem.

Nahlásit jako SPAM
IP: 213.211.51.–
fix0
Návštěvník
Včera   #11
-
0
-

Samozřejmě mám denní zálohy s historií dvou měsíců. :-)

Text je vždycky kódovaný? Ale když nastavím set names před všechny dotazy, tak v databázi budu mít přece nezašifrovaný text a na webu taky.

Takže slovo "Počítač" na webu = slovo "Počítač" v databázi, bez hieroglyfů. A o to mi jde.

Ale tak já na to teda kašlu nechám tam hieroglyfy a nebudu používat SET NAMES, nebudu se tím vůbec zabývat a nechám to jak to je, když to funguje. :-D

Nahlásit jako SPAM
IP: 31.30.173.–
peter
~ Anonymní uživatel
3532 příspěvků
Včera   #12
-
+1
-
Zajímavé
fix +

Ok. takze na webu je to dobre. V databazi je to nejak, ale zobrazi se to dobre.
Takze data mas dobre, neni treba provadet opravy po jednom znaku. Proste je vytahni najednou.
Zjisti, jake prikazy pouziva web pro databazi (jestli pouziva SET NAMES a jake kodovani nebo zadne, pak zjisti default kodovani sql, ve kterem ti to posila). Zjisti, jak ti to web zobrazuje. A prekoduj to.

Cili, jak jsem psal, priklad.
Db ma default kodovani LATIN1.
Web nema SET NAMES, takze se pripojuje k db s kodovanim LATIN1. (A uklada to do tabulky, ktera ma treba UTF, na tom vubec nesejde, protoze to uklada do tabulky v latin1; informace o kodovani v tabulce je pouze informativni, nemusi odpovidat tomu, jak jsou kodovany data).
Na web to zobrazujes jako utf8, treba, php header(...utf8). A zobrazi se znaky spravne, diakritika.

Cili, ty musis udelat to, ze php scriptem vytahnes data a nasoukas je zpet. A pak opravis ve svem programu SET NAMES na utf8. Mezitim by bylo dobre, aby jsi cely program zablokoval, bud prepnout do nejakeho rezimu udrzby v programu, pokud to umoznuje. A nebo pres htaccess vsechno presmeroval na nejakou html stranku, oznamujici udrzbu. At ti nam nikdo needituje.
V programu pak mas
SET NAMES latin1 nebo nic. Vytahnes data. Nastavis SET NAMES na UTF. Ulozis data. Kompletne cele tabulky i s id-autoincremencem a tak. (mozna je prikaz na kopii cele tabulky, ale nevim, zda se u toho da nastavit kodovani)
(ted by se to melo v phpmyadminu nebo nejakem tom programu na databazi zobrazovat ok)
Doporucuji zalozit si duplicitni tabulky nebo databazi bokem a cely prevod realizovat tam. A pak v programu nastavit, ze ma zobrazovat data z jine database.


Nevim, zda jsem to popsal dobre. Zkus treba poslat vzorek exportu. A pridej informaci o nastaveni db a strukturu tabulky. Priklad:
 

-- phpMyAdmin SQL Dump
-- version 4.0.10deb1
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Feb 18, 2019 at 10:39 AM
-- Server version: 5.6.33-0ubuntu0.14.04.1-log
-- PHP Version: 5.5.9-1ubuntu4.21

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

/*!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 */; -- tento radek je dulezity

--
-- Database: `EvidenceActivity`
--

--
-- Table structure for table `s_link`
--

CREATE TABLE IF NOT EXISTS `s_link` (
  `idpril` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `iduser` int(10) unsigned NOT NULL DEFAULT '0',
  `idsem` int(10) unsigned NOT NULL DEFAULT '0',
  `idpred` int(10) unsigned NOT NULL DEFAULT '0',
  `idtmp` int(10) unsigned NOT NULL DEFAULT '0',
  `nazev` varchar(255) NOT NULL DEFAULT '',
  `link` varchar(255) NOT NULL DEFAULT '',
  `logdate` date NOT NULL DEFAULT '0000-00-00',
  `loguser` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`idpril`),
  KEY `idsem` (`idsem`),
  KEY `idpred` (`idpred`),
  KEY `idtmp` (`idtmp`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=193 ; -- a tento radek je dulezity (teda, spis informativni, ale kdybych delal pokus na tvych datech, jak si mam nastavit tabulku a ladit do te doby nez mi to phpmyadmin zobrazi ok)

Tam jsem oznacil 2 radky, ktere jsou dulezite.

Nahlásit jako SPAM
IP: 193.84.207.–
fix0
Návštěvník
Včera   #13
-
0
-

Pročistil jsem to o zbytečnosti a ukázal ti jeden příklad tabulky, který reprezentuje všechny ostatní, všechno ostatní by mělo být po tomto vzoru stejné, ale neručím za to, zkusím vygooglit dotaz, který vypíše seznam kde je jaké porovnání a odhalím tak ,jestli je všude stejné:

-- phpMyAdmin SQL Dump
-- version 4.4.15.10
-- https://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Jan 21, 2020 at 11:02 AM
-- Server version: 5.5.64-MariaDB
-- PHP Version: 5.4.16

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!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 utf8mb4 */;

--
-- Database: `md_391lhU7n1k`
--

-- --------------------------------------------------------

--
-- Table structure for table `archiv`
--

CREATE TABLE IF NOT EXISTS `archiv` (
  `id` int(255) NOT NULL,
  `typ` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `druh` varchar(255) COLLATE utf8_czech_ci NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

--
-- Table structure for table `druhy`
--

CREATE TABLE IF NOT EXISTS `druhy` (
  `id` int(11) NOT NULL,
  `druh` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  `id_typu` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=276 DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;


INSERT INTO `skupiny` (`id`, `sada`, `popis`, ...) VALUES
(7, 'BIG admin', 'hlavní administrátor všeho', 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1),
(23, 'Root access', 'Prosím nikomu nepřiřazovat', 1, 2, 2, 2, 1, 2, 2, 1, 2, 2, 1, 1, 1, 1, 1, 2, 2),
(37, 'Revizní technik', 'Uživatelé, kteří mají užvatelské rozhranní šablony pro techniky.', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(38, 'Lhůtník - editace', 'může editovat ve lhůtníku', 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
(39, 'Lhůtník - read only', 'Vidí lhůtník a nemůže editovat', 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);


/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Akorát mi není jasné, proč mě tlačíte do toho, abych ten zašifrovaný bordel uvnitř databáze řešil opravou přes PHP skript, v mých rukou by to dopadlo zřejmě špatně. Funguji spíše style pokus a omyl. :-D Přijde mi mnohem jednodušší v dumpu CTRL + H ("í","Ã");("é","é");("ů","ů");... A až se diakritika opraví, nahrát data zpět na server a všude nastavit set names utf8. Pořád si melu svou, já vím, ale je to asi na mě složitý problém, protože nechápu vaše vysvětlení, proč bych to neměl dělat takhle jednoduše a měl bych to řešit jinak, když tohle je práce na 10 minut, přičemž přes PHP bych jen 30 minut googlil jak by se to dalo udělal a dalších 30 minut to furmuloval, aby to u mě fungovalo a když to po hodině zkusím, tak si to rozhasim ještě víc. :-D

Že b proto, že to není jen o ěščřžýáíéůúĚŠČŘŽÝÁÍÉŮÚ, ale i dalších znacích, ale hádám, že nikdo neměl žádnou motivaci používat nějaké speciálity. Ještě asi třeba zavynáč apod, ale to už bych potom vyřešit SQL dotazem v příslušném sloupečku.
 

Nahlásit jako SPAM
IP: 31.30.173.–
gna
~ Anonymní uživatel
1048 příspěvků
Včera   #14
-
0
-

To není zašifrovaný bordel. Už jsem ti psal, že to je blbě zobrazené utf8. Sám jsi sem dal odkaz, ze kterého bys to mohl pochopit.

V lepším případě ti bude stačit se na ten dump databáze podívat v editoru podporujícím utf8 a bude to správně.

V horším případě máš ten text kódovaný dvakrát (nebo jinak rozvrtaný), takže budeš muset zkonvertovat data a opravit skripty.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032020 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý