Проблема сортировки SQL

У меня есть php-код, который анализирует XML-файлы и сохраняет проанализированную информацию в моей базе данных (MySQL) на моем сервере Linux. параметры сортировки всех моих таблиц - "utf8_unicode_ci", даже параметры сортировки моей базы данных - "utf8_unicode_ci". В моих XML-файлах много языков (турецкий, шведский, французский и т. д.), и я хочу, чтобы специальные символы на этих языках были сохранены в их первоначальная форма, но моя проблема в том, что шаблон XML выглядит так:

<match date="24.08.2012" time="17:00" status="FT" venue="Stadiumi Loro Boriçi (Shkodër)" venue_id="1557" static_id="1305963" id="1254357">

значение места будет храниться в моей базе данных следующим образом:

Stadiumi Loro Boriçi (Shkodër)

Кто-нибудь может мне помочь сохранить значение в моей базе данных, как это???

1 ответ

Решение

Попробуйте использовать команду "SET NAMES utf8" перед запросом. Как сказано в руководстве:

SET NAMES указывает, какой набор символов будет использовать клиент для отправки операторов SQL на сервер.

Я пытался подражать вашему делу. Создана таблица test1:

DROP TABLE IF EXISTS `test1`;
CREATE TABLE `test1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `value` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

И попытался вставить строку с французскими спецсимволами и китайскими. Для меня это работало нормально, даже без SET NAMES,

<?php
$str = "çëÙùÛûÜüÔô汉语漢語";

try {

      $conn = new PDO('mysql:host=localhost;dbname=test', 'user', '');
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

      $conn->exec("SET NAMES utf8");
      $stmt = $conn->prepare('INSERT INTO test1 SET value = :value');
      $stmt->execute(array('value' => $str));

      //select the inserted row
      $stmt = $conn->prepare('SELECT * FROM test1 WHERE id = :id');
      $stmt->execute(array('id' => 1));
      while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            print_r($row);
      }
}
catch(PDOException $e) {
      echo 'ERROR: ' . $e->getMessage();
}

Он работал правильно, распечатав это:

Array
(
    [id] => 1
    [value] => çëÙùÛûÜüÔô汉语漢語
)

Также, когда вы тестируете, не читайте напрямую из консоли, перенаправьте вывод в файл и откройте его в текстовом редакторе:

php test.php > 1.txt
Другие вопросы по тегам