Intereting Posts
Объясните это регулярное выражение UTF-8 WooCommerce: Как вы добавляете текст перед ценой и до цены продажи? Будет ли файл_get_contents неудачным изящно? Использование переменных PHP SESSION для хранения результатов запросов MySQL как отправлять значения массива через url в PHP? Кодировать и декодировать идентификатор сообщения URL-адреса, используя php Помещение значения по умолчанию в <input type = file …> Простейший пример PHP для извлечения user_timeline с API-интерфейсом Twitter версии 1.1 Как запустить PHP-код асинхронный Что такое хороший брокер сообщений, который работает с PHP? Как получить данные из Paypal, чтобы я мог соответствующим образом изменить свою базу данных MySQL? Несколько внешних файлов JavaScript с использованием одного тега сценария Запрос cURL / PHP Выполняет 50% времени Как вызвать фильтр «time_diff» в Twig Глобальная переменная PHP, не найденная в функциях

как справляться с акцентами и странными символами в базе данных?

я пытаюсь сохранить испанские слова с акцентом в моей базе данных, но это не сработает, я уже пробовал:

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(); } } 

Редактировать:

я не могу сохранить акцент, он показывает, как странные символы, такие как á = á

Solutions Collecting From Web of "как справляться с акцентами и странными символами в базе данных?"

Collation влияет только на сортировку текста, она не влияет на фактический набор символов хранимых данных.

Я бы рекомендовал эту конфигурацию:

  1. Установите набор символов только для всей базы данных , поэтому вам не нужно устанавливать его для каждой таблицы отдельно. Набор символов наследуется от БД к таблицам в столбцы. Используйте utf8 как набор символов.

  2. Установите набор символов для соединения с БД . Выполните эти запросы после подключения к базе данных:

     SET CHARACTER SET 'utf8' SET NAMES 'utf8' 
  3. Задайте набор символов для страницы , используя 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.