Forum » Izdelava spletišč » utf-8 in dolzina polja v mysql
utf-8 in dolzina polja v mysql
tmz ::
Hi!
Nekaj me baše. Gre za vpisovanje šumnikov peko php v mysql.
Vse imam nastavljeno na utf-8.
Na mysql je
- character_set_database nastavljen na utf8
- collation_database nastavljen na utf8_general_ci
- baza je kreirana z DEFAULT CHARACTER SET 'utf8' in DEFAULT COLLATE 'utf8_general_ci' na koncu
- tip polja je varchar(10)
v php file-u imam
meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
ko odpiram connection imam
@mysql_query("SET NAMES 'utf8'");
Nimam problema s prikazovanjem na strani. To dela kot mora. Moti me samo to, da če recimo vpišem samo črko š in dam naj mi sql pove dolžino polja:
SELECT length(ImePolje)
FROM ImeTabele
pokaže rezultat 2. Saj vem, da šumniki v UTF-8 zasedejo 2 znaka. Samo se mi zdi, da bi baza to morala vedet in še vedno dat rezultat 1.
Sem najprej mislil, da je to problem MySql-Fronta. Pa sem tam nastavljal SET NAMES na vse živo in je bilo vedno isto. Sem šel tudi preko konzole in isto. Na koncu naredim še izpis dolžine polja preko php strani. In tudi še vedno kaže 2.
Sedaj pa ne vem ali je to normalno ali ne? Jaz bi rekel, da ne. Sploh ko prebereš tole
MySql unicode
kjer nekje na sredini piše tole:
Sigurno ste to že delal in bi prosil, da me malo razsvetlite.
Hvala!
tmz
Nekaj me baše. Gre za vpisovanje šumnikov peko php v mysql.
Vse imam nastavljeno na utf-8.
Na mysql je
- character_set_database nastavljen na utf8
- collation_database nastavljen na utf8_general_ci
- baza je kreirana z DEFAULT CHARACTER SET 'utf8' in DEFAULT COLLATE 'utf8_general_ci' na koncu
- tip polja je varchar(10)
v php file-u imam
meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
ko odpiram connection imam
@mysql_query("SET NAMES 'utf8'");
Nimam problema s prikazovanjem na strani. To dela kot mora. Moti me samo to, da če recimo vpišem samo črko š in dam naj mi sql pove dolžino polja:
SELECT length(ImePolje)
FROM ImeTabele
pokaže rezultat 2. Saj vem, da šumniki v UTF-8 zasedejo 2 znaka. Samo se mi zdi, da bi baza to morala vedet in še vedno dat rezultat 1.
Sem najprej mislil, da je to problem MySql-Fronta. Pa sem tam nastavljal SET NAMES na vse živo in je bilo vedno isto. Sem šel tudi preko konzole in isto. Na koncu naredim še izpis dolžine polja preko php strani. In tudi še vedno kaže 2.
Sedaj pa ne vem ali je to normalno ali ne? Jaz bi rekel, da ne. Sploh ko prebereš tole
MySql unicode
kjer nekje na sredini piše tole:
Tip: To save space with UTF-8, use VARCHAR instead of CHAR. Otherwise, MySQL must reserve three bytes for each character in a CHAR CHARACTER SET utf8 column because that is the maximum possible length. For example, MySQL must reserve 30 bytes for a CHAR(10) CHARACTER SET utf8 column.
Sigurno ste to že delal in bi prosil, da me malo razsvetlite.
Hvala!
tmz
frke ::
V bistu je to pravilno delovanje mysql funkcije LENGTH().
Po definiciji vrne dolžino v bytih. UTF-8 znaki 螚ȎŠ so dolgi 2 byta, nekateri druge črke (kitajske, arabske) lahko tudi 3.
Število črk ti vrne funkcija CHAR_LENGTH()
Še link: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_length
LENGTH(str)
Returns the length of the string str, measured in bytes. A multi-byte character counts as multiple bytes. This means that for a string containing five two-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH()
Po definiciji vrne dolžino v bytih. UTF-8 znaki 螚ȎŠ so dolgi 2 byta, nekateri druge črke (kitajske, arabske) lahko tudi 3.
Število črk ti vrne funkcija CHAR_LENGTH()
Še link: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_length
LENGTH(str)
Returns the length of the string str, measured in bytes. A multi-byte character counts as multiple bytes. This means that for a string containing five two-byte characters, LENGTH() returns 10, whereas CHAR_LENGTH()
Zgodovina sprememb…
- spremenil: frke ()
t3hn0 ::
kaj pa ce text preberes, pa prestejes znake s phpjem? ce se ne motm je za to funkcija strlen()
^.^
tmz ::
Hi!
Ok. Zatopim.
....
Sem sedaj probal in mi tudi strlen() vrne za črko š vrednost 2.
Dejansko me še najbolj moti to, da če dam recimo varchar(1), sploh ne morem not vpisat šumnika.
Ali pa drugi primer, zaradi katerega sem sploh padel sem not: imam nek naslov v cirilici. Polje v MySql imam dolgo recimo 20 znakov. Za latin2 in slovenske naslove je to dovolj prostora. Ko pa dam vse na utf8 mi pa za naslov v cirilici zmanjka prostora (itak, če pa vsaka črka zasede dve mesti).
Pa valda, recimo srbi, ne delajo dvakrat daljša polja v MySql zaradi tega. Tukaj mora biti neka fora.
tmz
Ok. Zatopim.
....
Sem sedaj probal in mi tudi strlen() vrne za črko š vrednost 2.
Dejansko me še najbolj moti to, da če dam recimo varchar(1), sploh ne morem not vpisat šumnika.
Ali pa drugi primer, zaradi katerega sem sploh padel sem not: imam nek naslov v cirilici. Polje v MySql imam dolgo recimo 20 znakov. Za latin2 in slovenske naslove je to dovolj prostora. Ko pa dam vse na utf8 mi pa za naslov v cirilici zmanjka prostora (itak, če pa vsaka črka zasede dve mesti).
Pa valda, recimo srbi, ne delajo dvakrat daljša polja v MySql zaradi tega. Tukaj mora biti neka fora.
tmz
tmz ::
Hi!
Se posuvam s pepelom. Sem šel sedaj še enkrat testirat step-by-step in v varchar(1) lepo vpiše šumnik.
Sem ugotovil, da je problem drugje. Problem je v string funkcijah v PHP-ju. Recimo substr() in pa strlen() dejansko delajo po bytih:
Kaj se pa tukaj da narest?
tmz
Se posuvam s pepelom. Sem šel sedaj še enkrat testirat step-by-step in v varchar(1) lepo vpiše šumnik.
Sem ugotovil, da je problem drugje. Problem je v string funkcijah v PHP-ju. Recimo substr() in pa strlen() dejansko delajo po bytih:
strlen simply counts the number of bytes in a string, not the number of characters. This means for UTF-8 the integer it returns is actually longer than the number of characters in the string.
Kaj se pa tukaj da narest?
tmz
Gost ::
Torej si že sam ugotovil. Preberi si komentarje na http://si.php.net/strlen
Tam je med drugim podana tudi funkcija za določanje števila znakov v utf8 stringih.
Tam je med drugim podana tudi funkcija za določanje števila znakov v utf8 stringih.
t3hn0 ::
kje si to nasel? v uradni dokumentaciji pise:
Description
int strlen ( string $string )
Returns the length of the given string .
poleg tega ce probas recimo
echo strlen("ašbčnž");
ti izpise 6, kar je prov. in ne napise 9.
edit:
pardon..sm probu iz baze prestet, pa mas prov
Description
int strlen ( string $string )
Returns the length of the given string .
poleg tega ce probas recimo
echo strlen("ašbčnž");
ti izpise 6, kar je prov. in ne napise 9.
edit:
pardon..sm probu iz baze prestet, pa mas prov
^.^
Zgodovina sprememb…
- spremenil: t3hn0 ()
arjan_t ::
popolno unicode podporo bo prinesel php6 (enkrat naslednje leto), za zdaj so pač Multibyte String funkcije kot je že bilo napisano
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Html forms & php -> prikaz statusaOddelek: Izdelava spletišč | 1717 (1631) | mercury |
» | [PHP]Timestamp in mysqlOddelek: Programiranje | 2382 (2047) | 680x0 |
» | [PHP] charter set windows-1250Oddelek: Programiranje | 2852 (2852) | Blisk |
» | [c++] osnovna težava z mysql apiOddelek: Programiranje | 2079 (1718) | SasoS |
» | MySQL in czsOddelek: Izdelava spletišč | 3621 (2711) | krho |