Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment spécifier la collation avec PDO sans SET NAMES ?

Voici une réponse deux en un.

Vous pouvez le définir dans le DSN ou en tant que MYSQL_ATTR_INIT_COMMAND (options de connexion).

DSN est mieux, je pense.

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

Si vous spécifiez UTF-8 vous travaillez avec le classement par défaut de utf8_general_ci , sauf si votre table ou champ de base de données utilise quelque chose de différent.

Si vous souhaitez que l'ensemble du serveur réponde avec ce classement par défaut, utilisez les directives de configuration :

collation_server=utf8_unicode_ci 
character_set_server=utf8

Vous n'avez donc pas à le spécifier à chaque connexion.

Les classements affectent le tri des caractères et sont définis sur la table et les champs de votre base de données. Ces paramètres sont respectés lors de l'interrogation de la table. Assurez-vous qu'ils sont définis. Utilisez les noms UTF-8 avec le classement défini dans votre base de données.

Votre commentaire :

Citons le Manuel MySQL pour le prouver :

Ma réponse :Cela fonctionne implicitement, à moins que vos tables ne modifient cela explicitement.

Question du commentaire :

Exemple :le classement des colonnes remplace le classement des tables

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

Si CHARACTER SET X et COLLATE Y sont spécifiés sur une colonne, le jeu de caractères X et le classement Y sont utilisés. La colonne a le jeu de caractères utf8 et classement utf8_unicode_ci comme spécifié dans la colonne du tableau, alors que le tableau est en latin1 + latin1_bin.

Exemple :en général, le classement des tables est utilisé

Si le classement n'est pas explicitement spécifié sur une colonne/Champ, alors le classement de la table est utilisé :

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

col1 a le classement latin1_bin.

Si vous voulez utf8_unicode_ci classement, définissez-le sur vos tables en général ou sur les colonnes/champs.