Как установить параметры сортировки с помощью mysqli?


Моя база данных использует параметры сортировки utf8_czech_ci, и я тоже хочу установить их для подключения к базе данных. Mysqli_set_charset не позволит мне установить параметры сортировки, если мне не понадобится значение по умолчанию, utf8_general_ci. Здесь было предложено сначала установить кодировку через mysqli_set_charset, а затем установить параметры сортировки по ИМЕНАМ НАБОРОВ. Поэтому я сделал это, и параметры сортировки соединений по-прежнему utf8_general_ci.

РЕДАКТИРОВАТЬ: теперь я в основном использую код Ваш здравый смысл предложено:

  $spojeni=mysqli_connect('mysql01','username','password', 'my_database');
  if (!$spojeni) die('Nepodařilo se připojit k databázi.');
  mysqli_set_charset($spojeni,'utf8');
  mysqli_query($spojeni, "SET COLLATION_CONNECTION = 'utf8_czech_ci';");

Однако я только что столкнулся с Незаконным сочетанием параметров сортировки ошибка. Во время тестирования моих параметров сортировки соединений через mysqli_get_charset() я обнаружил, что мои параметры сортировки "utf8_general_ci", а не "utf8_czech_ci", как должно быть. Это означает, что первоначальный принятый ответ перестал работать по какой-то таинственной причине. Я протестировал его как на локальном хосте, так и на размещенном сервере, и даже сразу после объявления базы данных, поэтому кажется, что произошла какая-то ошибка при изменении параметров сортировки невозможно.

Итак, как изменить параметры сортировки каким-либо другим способом?

Мой прежний код, по причинам архивирования:

  $spojeni=mysqli_connect('mysql01','username','password');
  if (!$spojeni) die('Nepodařilo se připojit k databázi.');
  mysqli_query($spojeni, "USE my_database");
  mysqli_set_charset($spojeni,'utf8');
  mysqli_query($spojeni, "SET NAMES 'utf8' COLLATE 'utf8_czech_ci';");

ПРАВКА 2: show variables like "%collation%"; показывает значение collation_connection как utf8_general_ci; другие переменные сортировки имеют значение utf8_czech_ci. При выполнении этой команды в Adminer я вижу utf8_czech_ci в collation_connection только тогда, когда я запускаю ее после любого из SET NAMES или SET COLLATION_CONNECTION (точный синтаксис см. В Последних строках моего кода выше). Когда я запускаю show variables из кода php (через mysqli_query), он отображается как utf8_czech_ci, но сравнение значения выбранный из таблицы и значение, установленное клиентом, все еще жалуется на незаконное сочетание параметров сортировки.

Подробности подробности в моем соответствующем вопросе.

ПРАВКА3: Я нашел хороший обходной путь для ошибок . Я все еще не понимаю, почему существует разница между переменными, показанными в Adminer и в запросе Mysqli, но я уже просил об этом в следующем вопросе . В отличие от моего подозрения, первоначально принятый ответ работает, по крайней мере, большинство того времени, поэтому я снова принимаю это.

Author: Community, 2013-12-17

3 answers

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli=mysqli_connect('mysql01','username','password', 'my_database');
mysqli->set_charset('utf8');
mysqli->query("SET collation_connection = utf8_czech_ci");
 6
Author: Your Common Sense, 2013-12-17 20:28:23

Из документации php

Это предпочтительный способ изменить кодировку. Не рекомендуется использовать mysqli_query() для его установки (например, ЗАДАВАТЬ ИМЕНА utf8). Смотрите раздел Концепции набора символов MySQL для получения дополнительной информации.

Важный совет из комментария http://php.net/manual/en/mysqlinfo.concepts.charset.php от mkroese в eljakim точка nl:

Пожалуйста, обратите внимание, что кодировка utf8 MySQL имеет максимум 3 байта и не может кодировать все символы юникода.

Если вам нужно кодировать символы за пределами BMP (базовый многоязычный Плоскость), как эмодзи или другие специальные символы, вам нужно будет использовать другую кодировку, такую как utf8mb4 или любую другую кодировку, поддерживающую более высокие плоскости. Mysql отбросит любые символы, закодированные в 4 байтах (или более).

См. https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html для дополнительная информация по этому вопросу

 1
Author: Alexander Behling, 2018-09-07 10:20:18

Я не думаю, что вы можете указать конкретные параметры сортировки для соединения. Это тоже не имеет смысла. Независимо от того, какие параметры сортировки вы выберете, символы, проходящие через соединение, всегда будут одинаковыми. Параметры сортировки вступают в силу для серверных задач, таких как сопоставление, упорядочивание и т.д.

Так что вы должны быть в порядке с utf8.

 0
Author: Pekka 웃, 2013-12-17 19:47:40