2012-05-31 6 views
8

Sto recuperando dati in arabo da tabelle MySQL con MySQLi. Così io di solito uso questo in stile procedurale:Imposta set di caratteri usando MySQLi

mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8'); 

Ora sto usando lo stile di programmazione orientata agli oggetti in modo sto cercando di vedere se c'è qualcosa che potrebbe impostare piuttosto che il di cui sopra?

L'ho trovato solo nel manuale di PHP, così l'ho fatto, ma per quanto riguarda l'impostazione dei nomi su UTF8?

$mysqli->set_charset("utf8"); 
+0

Si noti che 'mysqli_set_charset' esiste in stile procedurali troppo - non ci sono differenze nelle capacità o il comportamento degli stili procedurali e per l'utilizzo di OOP MySQLi attuali. Si noti inoltre che l'uso esplicito di 'SET NAMES' o' SET CHARACTER SET' qui sarebbe sbagliato in entrambi gli stili; preferisco sempre 'mysqli_set_charset' (o il suo equivalente OOP). –

+0

Do _non_ mix 'mysql_ *' e 'mysqli_ *' interfacce. Semplicemente _non_ usa le funzioni deprecate (e rimosse in PHP 5.7) 'mysql_ *'. –

risposta

9

E 'lo stesso:

$ mysqli-> query ("SET 'utf8' NOMI");

Dal manuale:

Questo è il modo preferito per modificare il set di caratteri. Utilizzare mysqli :: query() per eseguire SET NAMES .. non è raccomandato.

$mysqli->set_charset("utf8"); è appena sufficiente, lasciare che il driver mysqli db faccia la cosa per voi.

+0

Così tengo quello che ho trovato nel manuale PHP + quello che hai qui, o uno sarebbe sufficiente? –

+2

La documentazione dice '... L'utilizzo di mysqli :: query() per eseguire SET NAMES .. non è raccomandato. Http://php.net/manual/de/mysqli.set-charset.php – sofl

+1

@sys_debug Sembra come se non avessi bisogno di 'SET NAMES 'utf8'',' $ mysqli-> set_charset ("utf8") 'sarà sufficiente. – xdazz

-1
mysqli_query($conn,"SET NAMES 'latin5'");

$ conn = connessione stringa

+1

Sebbene questo codice possa rispondere alla domanda, fornendo il contesto supplementare per _why_ e/o _how_ risponde allo la domanda migliorerebbe significativamente il suo valore a lungo termine . Per favore [modifica] la tua risposta per aggiungere qualche spiegazione. –

6

si dovrebbe usare

$mysqli->set_charset("utf8"); 

Non uso SET NAMES o SET CHARACTER SET in modo esplicito quando si utilizza MySQLi., E di certo non utilizzare sia come il domanda di domanda qui era originariamente. Le ragioni che si tratta di una cattiva idea:

  • Calling SET CHARACTER SET utf8 dopo SET NAMES utf8 in realtà solo undoes some of the work that SET NAMES did.
  • Il manuale PHP explicitly warns us da usare mysqli_set_charset, non SET NAMES:

    Questo è il modo preferito per modificare il set di caratteri. L'utilizzo di mysqli_query() per impostarlo (come SET NAMES utf8) non è raccomandato. Vedi la sezione Concetti sui set di caratteri MySQL per maggiori informazioni.

  • Sotto il cofano, mysqli_set_charset è just a wrapper for mysql_set_character_set dall'API MySQL C (o il suo equivalente mysqlnd).Guardando il docs for that function, siamo in grado di vedere la differenza tra questo e SET NAMES:

    Questa funzione opera come la dichiarazione SET NAMES, ma stabilisce anche il valore di mysql->charset, e quindi influenza il set di caratteri usato da mysql_real_escape_string()

    In altre parole, $mysqli->set_charset('foo') fa tutto ciò che fa SET NAMES foo e assicura che mysqli_real_escape_string rispetti la nuova codifica. A dire il vero, se si utilizzano solo codifiche come Latin 1 e UTF 8 che estendono rigorosamente ASCII (ovvero, che codifica tutte le stringhe ASCII esattamente come sarebbero codificate in ASCII), quindi l'uso di SET NAMES anziché set_charset non interromperà nulla. Tuttavia, se utilizzi codifiche più insolite come GBK, potresti finire con l'intenerire le tue stringhe o addirittura introdurre SQL injection vulnerabilities that bypass mysqli_real_escape_string.

E 'quindi buona norma utilizzare solo set_charset, non SET NAMES. Non c'è nulla che lo SET NAMES compia da set_charset e set_charset evita il rischio di un comportamento non corretto (o anche non corretto) dello mysqli_real_escape_string.

1

È possibile utilizzare questo. È davvero bello per mysqli Character Set

$dbhost  = "localhost"; 
$dbuser  = "root"; 
$dbpass  = "dbpass"; 
$dbname  = "dbname"; 

$conn = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname); 
mysqli_query($conn,"SET CHARACTER SET 'utf8'"); 
mysqli_query($conn,"SET SESSION collation_connection ='utf8_unicode_ci'"); 
+0

puoi leggere altre risposte prima di pubblicare il tuo –

0

Per gli amanti dello stile procedurale.

// Create connection 
$conn = mysqli_connect($servername, $username, $password, $dbname); 

/* change character set to utf8 */ 
mysqli_set_charset($conn,"utf8"); 
+0

Per favore non usare die() per segnalare errori. Vedi [Nozioni di base sugli errori] (https://phpdelusions.net/articles/error_reporting) –