Mysql
 sql >> Database >  >> RDS >> Mysql

Come specificare le regole di confronto con PDO senza SET NAMES?

Ecco una risposta due in uno.

Puoi impostarlo nel DSN o come MYSQL_ATTR_INIT_COMMAND (opzioni di connessione).

DSN è meglio, credo.

$connect = new PDO(
  "mysql:host=$host;dbname=$db;charset=utf8", 
  $user, 
  $pass, 
  array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
  )
); 

Se specifichi UTF-8 stai lavorando con le regole di confronto predefinite di utf8_general_ci , a meno che la tabella o il campo db non utilizzi qualcosa di diverso.

Se vuoi che l'intero server risponda con queste regole di confronto predefinite, usa le direttive di configurazione:

collation_server=utf8_unicode_ci 
character_set_server=utf8

Quindi non devi specificarlo in connessione ogni volta.

Le regole di confronto influiscono sull'ordinamento dei caratteri e vengono impostate sulla tabella e sui campi del database. Queste impostazioni vengono rispettate quando si interroga la tabella. Assicurati che siano impostati. Usa nomi UTF-8 con le regole di confronto impostate nel tuo db.

Il tuo commento:

Citiamo dal Manuale MySQL per provarlo:

La mia risposta:Funziona in modo implicito, a meno che le tue tabelle non lo modifichino esplicitamente.

Domanda dal commento:

Esempio:le regole di confronto delle colonne sostituiscono quelle delle tabelle

CREATE TABLE t1
(
    col1 CHAR(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci
) CHARACTER SET latin1 COLLATE latin1_bin;

Se su una colonna sono specificati sia CHARACTER SET X che COLLATE Y, vengono utilizzati il ​​set di caratteri X e la collation Y. La colonna ha il set di caratteri utf8 e confronto utf8_unicode_ci come specificato nella colonna della tabella, mentre la tabella è in latin1 + latin1_bin.

Esempio:in generale vengono utilizzate le regole di confronto delle tabelle

Se le regole di confronto non sono specificate in modo esplicito su una colonna/campo, vengono utilizzate le regole di confronto della tabella:

CREATE TABLE t1
(
    col1 CHAR(10)
) CHARACTER SET latin1 COLLATE latin1_bin;

col1 ha regole di confronto latin1_bin.

Se vuoi utf8_unicode_ci confronto, impostalo sulle tue tabelle in generale o sulle colonne/campi.