sql >> Databáze >  >> RDS >> Mysql

Jak specifikovat řazení s PDO bez SET NAMES?

Zde je odpověď dva v jednom.

Můžete to nastavit v DSN nebo jako MYSQL_ATTR_INIT_COMMAND (možnosti připojení).

DSN je podle mě lepší.

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

Pokud zadáte UTF-8 pracujete s výchozím řazením utf8_general_ci , pokud vaše db tabulka nebo pole nepoužívá něco jiného.

Pokud chcete, aby celý server odpověděl tímto výchozím řazením, použijte konfigurační direktivy:

collation_server=utf8_unicode_ci 
character_set_server=utf8

Nemusíte jej tedy zadávat při připojení pokaždé.

Porovnání ovlivňuje řazení znaků a je nastaveno v tabulce a polích ve vaší databázi. Tato nastavení jsou respektována při dotazování na tabulku. Ujistěte se, že jsou nastaveny. Použijte názvy UTF-8 s nastavením řazení ve vaší databázi.

Váš komentář:

Pojďme citovat z příručky MySQL abych to dokázal:

Moje odpověď:Funguje to implicitně, pokud to vaše tabulky explicitně nezmění.

Otázka z komentáře:

Příklad:Řazení sloupců přepíše řazení tabulek

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

Pokud je ve sloupci zadána ZNAKOVÁ SADA X i COLLATE Y, použije se znaková sada X a řazení Y. Sloupec má znakovou sadu utf8 a řazení utf8_unicode_ci jak je uvedeno ve sloupci tabulky, zatímco tabulka je ve formátu latin1 + latin1_bin.

Příklad:Obecně se používá řazení tabulek

Pokud není řazení ve sloupci/poli výslovně uvedeno, použije se řazení tabulky:

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

col1 má řazení latin1_bin.

Pokud chcete utf8_unicode_ci řazení, nastavte jej na vaše tabulky obecně nebo na sloupce/pole.



  1. Vnitřní spojení vs kde

  2. Jak převést epochu na časové razítko mySQL v JAVA

  3. 4 způsoby, jak zkontrolovat duplicitní řádky na serveru SQL

  4. SQL Server 2016:Vylepšení OLTP v paměti