2015-12-25 19 views
8

Sono un po 'confuso in questo momento ho una connessione PDO con charset=utf8 e il DB utilizza latin.set di caratteri tra PHP e MySQL

Cosa significa?

Il mio pensiero è che significa che ogni connessione eseguita da PHP sia l'invio o la ricezione dal DB è codificato per utf8. Comunque leggo molto che anche il DB dovrebbe usare lo stesso set di caratteri del PHP.

Qualcuno può spiegare in dettaglio il ruolo del set di caratteri in PHP e in DB MySQL esattamente e qual è il vantaggio di allinearli?

+0

Così tanti. La maggior parte delle lingue straniere. Se sei interessato a leggere questo http://htmlpurifier.org/docs/enduser-utf8.html#whyutf8 – devpro

risposta

2

Say PHP invia un testo a MySQL da memorizzare, qualcosa come

INSERT INTO `some_table` ("foo") VALUES 
('The quick brown fox jumps over the lazy dog'); 

L'intento fondamentale di questa query è ovviamente quello di dire a MySQL per memorizzare la stringa The quick brown fox jumps over the lazy dog ​​ nel database.

Se PHP è configurato per utilizzare UTF-8, significa che quando converte i caratteri leggibili da umani in binari - per trasmetterlo a MySQL - convertirà i caratteri utilizzando il sistema di codifica UTF-8.
MySQL è in grado di leggere caratteri codificati in UTF-8 e quindi non ha problemi a capire che la sequenza codificata digitalmente è intesa per significare T e h e e ecc. In caratteri leggibili dall'uomo.
Se MySQL è configurato per memorizzare i dati nella tabella some_table utilizzando latin1, quando riceve la stringa, sarà convertire i caratteri dalle loro codifiche UTF-8 agli equivalenti latini1 prima di salvare i dati sul disco rigido.
In questo caso non ci sono problemi - perché i caratteri dell'alfabeto inglese possono essere rappresentati sia da UTF-8 che da Latin1.
Tuttavia, i problemi si verificano se la stringa PHP inviata contiene caratteri che possono essere rappresentati solo da UTF-8 e non da Latin1, ad es. una citazione intelligente . Quando MySQL tenta di convertire la smart quote in un modulo digitale, non sarà in grado di - perché Latin1 non ha letteralmente codifica digitale definita per rappresentare .
Non sono sicuro di quale sia l'esatto processo di gestione degli errori di MySQL quando incontra questa situazione e se la situazione è recuperabile, ma generalmente il risultato finale è che la codifica sottostante sarà danneggiata e inutilizzabile.
Perché questo problema si verifica solo per quei caratteri che non possono essere rappresentati dai due sistemi - e se il 99% di tutte le comunicazioni coinvolge caratteri inglesi, potresti non notare un problema per un po 'e anche allora sarà solo occasionale carattere, ma cercando di recuperare quando si notano i problemi potrebbe essere frustrante.

+0

Questo è fantastico e spiega Molto grazie. Ma volevo chiederti, se uso utf8 in php è raccomandato che io usi lo stesso con MySQL anche se sto cercando di salvare le prestazioni con un DB con quasi 20 colonne e 2000 righe. E per il momento medio io uso solo l'inglese (potrebbe cambiare in futuro) – moawaya

+0

Cool. Non riesco a immaginare perché cambiare MySQL possa causare problemi di prestazioni, specialmente con un database così piccolo. Ma se fossi così preoccupato, puoi sempre impostare un DB e cronometrare le tue query con i vecchi e nuovi set di caratteri MySQL. La mia comprensione è che quando MySQL rilascia v6.0 UTF-8 si avvierà comunque il set di caratteri predefinito che si sposta in avanti –

+0

La commutazione non causerà problemi a causa delle query in corso. La mia comprensione è UTF8 richiede più spazio di Latino, rendendo più lenta la query, correggi se ho torto e dammi il tuo suggerimento finale sulla mia situazione. So che il DB è piccolo ma sto utilizzando risorse minime, quindi non lo faccio bisogno di succhiare tutta la potenza della tazza per le domande. – moawaya

Problemi correlati