я пытаюсь сохранить испанские слова с акцентом в моей базе данных, но это не сработает, я уже пробовал:
1) изменение коллизии таблиц и строк на utf8_spanish_ci
и utf_unicode_ci.
2) добавление тега заголовка с
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
3) добавление
header("Content-Type: text/html;charset=utf-8");
в теге php.
делать это на сервере xampp в моем ноутбуке будет работать, но когда я загружу базу данных на сервер монстра входа, он не сохранит акцент должным образом.
edit: это соединение im, использующее:
private function Connect() { //$this->settings = parse_ini_file("settings.ini.php"); try { # Read settings from INI file, set UTF8 $this->pdo = new PDO('mysql:host=localhost;dbname=xxxxx;charset=utf8', 'xxxxx', 'xxxxxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); # We can now log any exceptions on Fatal error. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); # Disable emulation of prepared statements, use REAL prepared statements instead. $this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); # Connection succeeded, set the boolean to true. $this->bConnected = true; } catch (PDOException $e) { # Write into log echo $this->ExceptionLog($e->getMessage()); die(); } }
Редактировать:
я не могу сохранить акцент, он показывает, как странные символы, такие как á = á
Collation влияет только на сортировку текста, она не влияет на фактический набор символов хранимых данных.
Я бы рекомендовал эту конфигурацию:
Установите набор символов только для всей базы данных , поэтому вам не нужно устанавливать его для каждой таблицы отдельно. Набор символов наследуется от БД к таблицам в столбцы. Используйте utf8
как набор символов.
Установите набор символов для соединения с БД . Выполните эти запросы после подключения к базе данных:
SET CHARACTER SET 'utf8' SET NAMES 'utf8'
Задайте набор символов для страницы , используя HTTP-заголовок и / или метатег HTML. Одного из них достаточно. Используйте utf-8
в качестве charset
.
Этого должно быть достаточно.
Если вы хотите иметь правильную сортировку испанских строк, установите порядок сортировки для всей базы данных. utf8_spanish_ci
должен работать ( ci
означает нечувствительность к регистру ). Без надлежащего сопоставления акцентированные испанские символы будут сортироваться всегда в последнюю очередь.
Примечание . Возможно, что набор символов, который у вас уже есть в таблице, сломан, потому что ранее была установлена некорректная конфигурация набора символов. Сначала вы должны проверить его с помощью какого-либо клиента БД, чтобы исключить этот случай. Если он сломан, просто вставьте свои данные с правильной настройкой набора символов.
объекты имеют атрибут набора символов , который может быть установлен явно или наследуется (server> database> table> column), поэтому наилучшим вариантом является его установка для всей базы данных
клиентское соединение также имеет атрибут набора символов, и он сообщает базе данных, в которой кодировка вы отправляете данные
Если наборы символов клиентского соединения и целевого объекта различны, данные, которые вы отправляете в базу данных, автоматически преобразуются из набора символов соединения в набор символов объекта.
Поэтому, если у вас есть, например, данные в utf8
, но клиентское соединение установлено на latin1
, база данных будет разорвать данные, потому что она попытается преобразовать utf8
как и latin1
.
Вот мой контрольный список для хранения символов UTF8. Хотя, не забудьте изолировать причину сбоя от того, где вы храните строки в базе данных – это означает, что строка, которую нужно сохранить, по-прежнему сохраняется, когда пользователь вводил ее.
Первый. Убедитесь, что набор символов используемой таблицы – utf8
или еще лучше, но utf8mb4
для полной поддержки Unicode (хотя и имеет свои недостатки). Не имеет значения, какая кодировка установлена для всей базы данных; он переопределяется определением таблицы, если указано. Код DDL для создания такой таблицы будет выглядеть так:
CREATE TABLE table_name ( id INT AUTO_INCREMENT NOT NULL, name VARCHAR(190) NOT NULL, date_created DATETIME NOT NULL, PRIMARY KEY(id) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB;
Во- вторых. Используйте кодировку utf8
для подключения к базе данных.
// This should be enough new PDO( 'mysql:host=localhost;dbname=xxxxx;charset=utf8mb4;', 'username', 'password' );
Для MySql Используйте этот код после вызова подключения к базе данных:
$set_utf=$dbh->exec("SET NAMES UTF8");
Мне пришлось хранить много акцентированных писем с разных языков (включая французский и испанский), и единственным безопасным способом, который я нашел на данный момент, было хранить все в utf8_ bin в MySQL и отображать страницы в charset utf-8, как вы это делаете , Никакой дальнейшей обработки не требуется ни от MySQL, ни от PHP.
Кроме того, убедитесь, что ваша IDE управляет вашими файлами в utf8.