Chyba zápisu s diakritikou – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Chyba zápisu s diakritikou – MySQL – Fórum – Programujte.comChyba zápisu s diakritikou – MySQL – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Forest0
Stálý člen
8. 9. 2013   #1
-
0
-

Zdravím,

mám SQL příkaz, který zapisuje do databáze. Dříve to bylo všechno v pořádku. Přešel jsem na jinou distribuci Linuxu a tedy i na novější verze LAMP. INSERT INTO mi nechce zapsat diakritiku. Místo toho se vloží "prázdno". Kde může být problém? Děkuji.

Nahlásit jako SPAM
IP: 92.62.230.–
z_moravec
~ Redaktor
+3
Posthunter
8. 9. 2013   #2
-
0
-

Zkontroluj nastavení kódování databáze a připojení.

Před insert vlož příkaz:

SET NAMES utf8


Samozřejmě místo utf8 musíš vložit kódování, které používáš.

Nahlásit jako SPAM
IP: 46.39.170.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Forest0
Stálý člen
8. 9. 2013   #3
-
0
-

#2 z_moravec
Mám tam:

@mysql_query("SET NAMES 'cp1250'") or die("Nepodarilo se nastavit jazykove rozhrani !");
Nahlásit jako SPAM
IP: 92.62.230.–
z_moravec
~ Redaktor
+3
Posthunter
8. 9. 2013   #4
-
0
-

#3 Forest
A posíláš tam ty data skutečně ve win-1250? Jak máš nastavené kódování databáze a tabulky?

Vypiš si ten dotaz a uvidíš, jestli je to OK. Zkus se podívat, jestli mysql_error() nevypíše nějakou chybu.

Nahlásit jako SPAM
IP: 46.39.170.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Forest0
Stálý člen
8. 9. 2013   #5
-
0
-

#4 z_moravec
Příkaz se vykoná v pořádku. Akorát nezapíše hodnotu do jednoho sloupce a do ostatních ano. Pokud je to bez diakritiky, tak se to zapíše a pokud je to s diakritikou, tak to nechá "prázdno" ve sloupci.

Nahlásit jako SPAM
IP: 92.62.230.–
z_moravec
~ Redaktor
+3
Posthunter
8. 9. 2013   #6
-
0
-

A u ostatních sloupců diakritika funguje? Zkontroluj kódování (porovnávíní, collation) tabulky a toho sloupce, který zlobí.

Nahlásit jako SPAM
IP: 46.39.170.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Forest0
Stálý člen
8. 9. 2013   #7
-
0
-

#6 z_moravec
Ne, nefunguje. Do každého sloupce, kam chci dát diakritiku, se to nezapíše.

Nahlásit jako SPAM
IP: 92.62.230.–
z_moravec
~ Redaktor
+3
Posthunter
8. 9. 2013   #8
-
0
-

#7 Forest
Tak viz předchozí, zkontroluj kódování ve všech krocích (skript, připojení, databáze, tabulka) a nastav tak, aby bylo všude stejné, pak to pojede.

Nahlásit jako SPAM
IP: 46.39.170.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Forest0
Stálý člen
Nahlásit jako SPAM
IP: 92.62.230.–
z_moravec
~ Redaktor
+3
Posthunter
8. 9. 2013   #10
-
0
-

#9 Forest
OK, a ten skript, který data posílá do db je v utf8 nebo win-1250?

Nahlásit jako SPAM
IP: 46.39.170.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Forest0
Stálý člen
8. 9. 2013   #11
-
0
-

#10 z_moravec 

$spojit = @mysql_connect($server, $username, $password) or die("Nepodařilo se připojit k MySQL !");
@mysql_select_db($dbname, $spojit) or die("Nepodařilo se připojit k databázi !");
@mysql_query("SET NAMES 'utf8'") or die("Nepodarilo se nastavit jazykove rozhrani !");

@mysql_query("INSERT INTO chat (chnick, chdatum, chcas, chbarva, chtext, che, chd) VALUES ('".$_SESSION["nick"]."', '".Date("d. m. Y")."', '".Date("H:i:s")."', '".$_SESSION["barva"]."', '".mysql_real_escape_string(HTMLSpecialChars($_POST["cht"]))."', '0', '0');");
Nahlásit jako SPAM
IP: 92.62.230.–
z_moravec
~ Redaktor
+3
Posthunter
8. 9. 2013   #12
-
0
-

#11 Forest
Je to nějaké zmatené, nejdřív píšeš, že tam máš set names cp1250, teď utf8?

Důležité je, aby kódování toho php skriptu bylo stejné, jako je kódování uvedené v set names. Jinak bude db dostávat zmršená data.

Nahlásit jako SPAM
IP: 46.39.170.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Forest0
Stálý člen
8. 9. 2013   #13
-
0
-

#12 z_moravec
No měl jsem tam cp1250 a změnil jsem to na utf8. Ale ani tak to nefunguje.

Nahlásit jako SPAM
IP: 92.62.230.–
Forest0
Stálý člen
8. 9. 2013   #14
-
0
-

A jak myslíš kódování php skriptu? Myslíš jako kódování toho souboru, ve kterém je skript?

Nahlásit jako SPAM
IP: 92.62.230.–
z_moravec
~ Redaktor
+3
Posthunter
8. 9. 2013   #15
-
0
-

#14 Forest
Přesně, kódování souboru.

Nahlásit jako SPAM
IP: 46.39.170.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Forest0
Stálý člen
8. 9. 2013   #16
-
0
-

#15 z_moravec
Kódování souboru je Windows (CP1250)

Nahlásit jako SPAM
IP: 92.62.230.–
z_moravec
~ Redaktor
+3
Posthunter
8. 9. 2013   #17
-
0
-

#16 Forest
Pak musí být

SET NAMES `cp1250`


Problém může být ještě v kódování toho řetězce, co posíláš z databáze. Pokud ho bereš z webového formuláře, tak musí být i ta webová stránka ve win-1250 a nesmí nikde po cestě dojít ke změně kódování.

Nahlásit jako SPAM
IP: 46.39.170.–
Spát lze čtyři hodiny denně, spát déle je nemístný přepych.
Thomas Alva Edison
Forest0
Stálý člen
8. 9. 2013   #18
-
0
-

#17 z_moravec
cp1250 tam mám celou dobu a nefunguje to ...Webová stránka má v hlavičce:

<meta http-equiv="content-type" content="text/html; charset=windows-1250" />
Nahlásit jako SPAM
IP: 92.62.230.–
peter
~ Anonymní uživatel
4014 příspěvků
9. 9. 2013   #19
-
0
-

Zkousel jsi to hledat googlem? Treba nejsi prvni clovek, co s tim ma problem.
https://www.google.cz/search?…

Ted to zrovna nemuzu najit, ale nekde na jpw jsem to vypsal, co vsechno ovlivnuje kodovani
- meta tag
- php default kodovani (nastaveni serveru)
- php header() (prebiji meta tag a php defaul kodovani)
- sql set names (pokud mas mysql verzi 4.2+)
- sql ulozene kodovani v tabulce

Pokud to utf8 tabulky ulozis pres set names utf8 kodovani win1250 a pak ho ctes pres set names cp1250, tak nedostanes spravne kodovani.
Pokud z sql vytahnes vse spravne a souboru das pres server php nebo php header jine kodovani, pak se zobrazi spatne.

Mozna by to chtelo zivou ukazku.

Nahlásit jako SPAM
IP: 193.84.207.–
Řešení
KIIV
~ Moderátor
+43
God of flame
9. 9. 2013   #20
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

kazdopadne nechapu proc mit scripty v cp1250... ulozeny na linuxovym serveru

kdyz uz ja neco delam, tak vzdy utf-8 a neni problem (ani kdyz ma server defaultni kodovani utf-8 - pak musi php poslat header s kodovanim, aby se to zmenilo) a tak dale...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Forest0
Stálý člen
9. 9. 2013   #21
-
0
-

#20 KIIV
Protože soubory ve windowsu jsou defaultně CP1250

Nahlásit jako SPAM
IP: 92.62.230.–
Forest0
Stálý člen
9. 9. 2013   #22
-
0
-

#19 peter 

$spojit = @mysql_connect($server, $username, $password) or die("Nepodařilo se připojit k MySQL !");
@mysql_select_db($dbname, $spojit) or die("Nepodařilo se připojit k databázi !");
@mysql_query("SET NAMES 'utf8'") or die("Nepodarilo se nastavit jazykove rozhrani !");

@mysql_query("INSERT INTO chat (chnick, chdatum, chcas, chbarva, chtext, che, chd) VALUES ('".$_SESSION["nick"]."', '".Date("d. m. Y")."', '".Date("H:i:s")."', '".$_SESSION["barva"]."', '".mysql_real_escape_string(HTMLSpecialChars($_POST["cht"]))."', '0', '0');");
Nahlásit jako SPAM
IP: 92.62.230.–
KIIV
~ Moderátor
+43
God of flame
9. 9. 2013   #23
-
0
-

#21 Forest
tak to jo.. kde jsou ty casy, kdy sem pouzival notepad k programovani...

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peter
~ Anonymní uživatel
4014 příspěvků
10. 9. 2013   #24
-
0
-

Forest - ke? To je jakysi vycuc nic obycejneho kodu, ktery najdes na kazde druhe strance googlem (a ktery jsi uz uvedl drive). Link na stranku by byl lepsi, mohli bychom prozkoumat hlavicky, ktere posila tvuj server.
Cili, zatim muzu rici jen to, ze tam nemas zmenu kodovani pomoci funkce header(), takze spolehas na to, ze php server ma stejne nastaveni jako ten stary a posila stejne kodovani. Asi ma nastaveni jine :)

Nahlásit jako SPAM
IP: 193.84.207.–
Forest0
Stálý člen
10. 9. 2013   #25
-
0
-

#24 peter
Ta stránka není pro veřejnost. Odkaz na soubor - ZDE

Nahlásit jako SPAM
IP: 92.62.230.–
peter
~ Anonymní uživatel
4014 příspěvků
11. 9. 2013   #26
-
0
-

Link na stranku je neco jineho. Chapej, ja mam v prohlizeci web-developer nastroje, kterymi muzu studovat html stranku, jeji hlavicky (jake kodovani posila server) atd. Tohle je mi v celku na nic. Jen ti muzeme okomentovat par veci v kodu...

Si nejdriv zpracuj php, databaze a tak a pod to dej html, kde mas jen echo promennych. michat php/mysql kod s html ma smysl jen v pripade, ze chces usporit pamet. Kdyz si to pekne vsechno zpracujes nahore, pak ti staci 1x pripojeni, prihlaseni, setname a na konci close.

Koukam, ze mas mysql_query("SET NAMES 'utf8'") a <meta ...charset=windows-1250" />. kdyby to bylo online, dalo by se rici, jake asi mas kodovani v databazi. Ja bych tam pouzival spis "SET NAMES 'cp1250'".
 

Chat jsem taky delal, takovy jiny druh, spis ukazkovy, bez prihlasovani a bez javascriptu (to na jinem foru borecek delal machry, ze to bez js nejde, tak sem mu ukazal, ze dela jen machry :) ).
http://peter-mlich.wz.cz/…pr/minix.php
http://peter-mlich.wz.cz/…pr/minix.txt
http://peter-mlich.wz.cz/…pr/minix.sql

Nahlásit jako SPAM
IP: 193.84.207.–
peter
~ Anonymní uživatel
4014 příspěvků
11. 9. 2013   #27
-
0
-
Nahlásit jako SPAM
IP: 193.84.207.–
Forest0
Stálý člen
11. 9. 2013   #28
-
0
-

#27 peter
Kam přesně to mám dát? :-)

Nahlásit jako SPAM
IP: 92.62.230.–
peter
~ Anonymní uživatel
4014 příspěvků
11. 9. 2013   #29
-
0
-

:) Co treba trochu samostatne prace, google a tak? Tva otazka vyzniva ted tak, ze ti to mam napsat, rici presne cislo radku, pismenko po pismenku. :)
Prvni radky kodu bych mel...

<?php
session_start();
header("Content-Type: text/html; charset=windows-1250"); // treba sem to muzes napsat
require_once("dcdb.php");
$spojit = @mysql_connect($server, $username, $password) or die("Nepodařilo se připojit k MySQL !");
@mysql_select_db($dbname, $spojit) or die("Nepodařilo se připojit k databázi !");
@mysql_query("SET NAMES 'utf8'") or die("Nepodarilo se nastavit jazykove rozhrani !");

... pak vsecek ten balast php ...

@mysql_close($spojit);
?>
<html>
...
<? echo $prom1; ?>
...
<? echo $prom2; ?>
Nahlásit jako SPAM
IP: 193.84.207.–
KIIV
~ Moderátor
+43
God of flame
11. 9. 2013   #30
-
0
-

#29 peter
mozna mozna si mu tam mel jeste rovnou dat to spravny set names... precijen mit stranku v cp1250 a posilat do databaze data jakoby v utf8 neni idealni

Nahlásit jako SPAM
IP: 94.112.35.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Forest0
Stálý člen
11. 9. 2013   #31
-
0
-

#29 peter
Chtěl jsem pouze vědět, kam dát header ;) Nikdo po tobě nechce celý kód ;)

Nahlásit jako SPAM
IP: 92.62.230.–
Forest0
Stálý člen
11. 9. 2013   #32
-
0
-

#30 KIIV
Mám tam cp1250, ale ani tak to prostě nejde. Už jsem zkusil snad vše ...

Nahlásit jako SPAM
IP: 92.62.230.–
peter
~ Anonymní uživatel
4014 příspěvků
12. 9. 2013   #33
-
0
-

KIIV - Nemohl, nevim, jak ma kodovana data. Chapej, treba ma data ulozena pres SET NAMES utf8 z formulare v kodovani win1250. Pak by se s cp1250 ta data prekodovala a nebyla by spravna. Do te doby, nez da link na stranku nebo export z db (struktura, ukazka dat, aspon 3 radky s diakritikou). Takze jsem mu do toho nechtel sahat. Treba to ma zakodovane do latin1.

Schematicky:

1) html/php form win, data win
2) db SET prekodovani na utf8
3) db sloupec v utf8
... takze ted ty data musis tahat pres SET utf8, ale zobrazit pres php header charset s win kodovanim, aby se to spravne zobrazilo

Dokud nevis, jake bylo puvodni kodovani, co ma v db a jakou ma strukturu tabulek s jakym kodovanim bunek, jakou verzi mysql, tak nema smysl resit, co napsat do SET NAMES a header.

Nahlásit jako SPAM
IP: 193.84.207.–
peter
~ Anonymní uživatel
4014 příspěvků
13. 9. 2013   #34
-
0
-

jeste mne napadlo, jak jsem to resil ja. Zkusil jsem pres FF prepinat kodovani a zjistil jsem tak, ktere tam sedlo. Za predpokladu, ze mas spravne SET NAMES utf a pri vypisu struktury tabulky mas na sloupci take UTF, V phpmyadminu se dela vypis struktury tabulky pres zalozku Struktura a nebo pri exportu.

Struktura tabulky pro muj pokusny chat z phpmyadminu vypada takto:
http://peter-mlich.wz.cz/…pr/minix.sql

-- DROP TABLE IF EXISTS `m_banned`;
-- DROP TABLE IF EXISTS `m_rooms`;

CREATE TABLE `m_banned` (
`ip`	varchar(15)	NOT NULL default '',
`text`	varchar(255)	default NULL,
PRIMARY KEY(`ip`)
) TYPE=MYISAM;
-- ) TYPE=MyISAM COLLATE cp1250_general_ci;

CREATE TABLE m_rooms (
`id`	int(11)		NOT NULL AUTO_INCREMENT,
`nick1`	varchar(16)	default NULL,
`nick2` varchar(16)	default NULL,
`room`  int(11)		default NULL,
`type`	int(11)		default NULL,
`date`	datetime	NOT NULL default '0000-00-00 00:00:00',
`text`	varchar(255)	default NULL,
`ip1`	varchar(15)	default NULL,
`ver`	varchar(3)	default NULL,
PRIMARY KEY(`id`),
KEY (`nick1`),
KEY (`nick2`),
KEY (`room`),
KEY (`type`),
KEY (`ip1`)
) TYPE=MyISAM;
-- ) TYPE=MyISAM COLLATE cp1250_general_ci;

-- je komentar
Kodovani tabulky mam konkretne zakomentovane, protoze na localhost a na serveru mam rozdilne kodovani a nechal jsem zvolit default kodovani databaze..
Kodovani sloupcu tam nemam zadne, protoze chci aby odpovidali kodovani tabulky.

A) Cili, kdyz mam takhle vsechno default, tak, jestlize bude kodovani db utf, pouziji set names utf a data ulozim pres php formular s header utf, pak bude ulozene kodovani take utf, spravne. Kdyz ted budu chtit zobrazit data jako win1250, tak si udelam php s header win-1250 a pouziji SET NAMES cp1250. -- Tak by to melo spravne fungovat.

B) Ale, pokud mas ve sloupci ulozene jine kodovani nez mas nastavene na tabulce, tak by ses musel pripojit stejnym SET NAMES jako formular, ktery to ukladal, treba SET NAMES latin1. Data nacist do promenne a promennou prekodovat z latin1 do win-1250 pomoci iconv nebo mb_ treba do win-1250/cp1250, abys to mohl zobrazit v php formulari s header win-1250

http://www.php.net/manual/en/ref.mbstring.php (mb_check_encoding, mb_get_info, mb_internal_encoding, mb_convert_encoding)
http://www.php.net/…ok.iconv.php (iconv)

Jenze, pokud nevime, co mas v te tabulce ulozene (mysql dump, export), tak nelze rici, kterou z tech dvou operaci pouzit a jake kodovani na dana mista dosadit. Na linku na stranku by se to dalo aspon odhadovat, pripadne prepinat kodovani v prohlizeci a bud se trefit nebo odhadnout, jakemu se to blizi.

Nahlásit jako SPAM
IP: 193.84.207.–
peter
~ Anonymní uživatel
4014 příspěvků
13. 9. 2013   #35
-
0
-

V tom linku muzes dat jen jednoduchy kod, ktery vypise konkretni 3 radky (ktere nejsou tajne nebo kompromitujici), jeden select (WHERE id IN (11,230,345), treba), + ty header a setnames. Nic vic.

Nahlásit jako SPAM
IP: 193.84.207.–
Forest0
Stálý člen
13. 9. 2013   #36
-
0
-

Já už jsem to vyřešil, hoši ;)

Nahlásit jako SPAM
IP: 92.62.230.–
peter
~ Anonymní uživatel
4014 příspěvků
13. 9. 2013   #37
-
0
-

Mozna by bylo pekne rici, co bylo treba udelat :) Tohle tema se dost obtizne vysvetluje lajkovi, tak jako lajk, kdyz napises reseni, treba to nekomu pomuze.

Nahlásit jako SPAM
IP: 193.84.207.–
OkiKoki
~ Anonymní uživatel
5 příspěvků
3. 4. 2015   #38
-
0
-

Jednoduše stačí nastavit všude stejné kodování tzn.  

<meta charset='cp1250_czech_cs'>  


SET NAMES 'cp1250'

a databázi na cp1250_czech_cs

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

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×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, 8 hostů

Podobná vlákna

Chyba se znaky s diakritikou — založil Anonym

Dotaz k zápisu — založil JMM

Všebecná otázka zápisu — založil Spectator

Styl zápisu #include — založil survik1

 

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