» »

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:
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()

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

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:
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.

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 :8) :8)
^.^

Zgodovina sprememb…

  • spremenil: t3hn0 ()

snow ::

Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Gost ::

Meni pa echo strlen("ašbčnž"); izpiše 9.

arjan_t ::

popolno unicode podporo bo prinesel php6 (enkrat naslednje leto), za zdaj so pač Multibyte String funkcije kot je že bilo napisano

tmz ::

Hi!

Ja. Multibyte funkcije so rešitev. Hvala vsem.

tmz


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Html forms & php -> prikaz statusa

Oddelek: Izdelava spletišč
61640 (1554) mercury
»

[PHP]Timestamp in mysql

Oddelek: Programiranje
82252 (1917) 680x0
»

[PHP] charter set windows-1250

Oddelek: Programiranje
282705 (2705) Blisk
»

[c++] osnovna težava z mysql api

Oddelek: Programiranje
221995 (1634) SasoS
»

MySQL in czs

Oddelek: Izdelava spletišč
423501 (2591) krho

Več podobnih tem