Php sql русский язык

MySQL 4.1+ и любые проблемы с русскими буквами

У MySQL версии 4.1 и выше (далее 4.1+) с русскими буквами бывают несколько проблем — рассмотрим их по отдельности.

1. PHP использует неверную кодировку в качестве клиентской.

  • Через phpMyAdmin (здесь и далее подразумевается версия умеющая работать с кодировками, т.е. >= 2.6.0) все по-русски, а в скрипт приходят вопросительные знаки.
  • Скрипт, заносящий данные в базу, видит русский нормально, а после вставки, как в правильном скрипте, так и в phpMyAdmin-е — знаки вопросов.

Тестирование:
Попробуйте в начале вашего скрипта, но после соединения, выполнить SQL-запрос «SET NAMES кодировка» . Где кодировка — та кодировка, в которой у вас (по вашему мнению) данные. Например, для русской Windows кодировки (windows-1251) это будет cp1251, для KOI8-R – koi8r, для UTF-8 – utf8 и так далее. В дальнейшем она будет упоминаться как «кодировка».

Результат тестирования:

  • Если буквы (но необязательно слова) стали русскими, значит, данные в базе лежат в правильной кодировке, сама база эту самую кодировку и использует.
  • Если буквы стали русскими, а слова нет («бнопня»), значит, скрипт ожидает данные в другой русской кодировке — пробуйте другие, пока не получится русских слов.

Решение:
1) Оставить запрос «SET NAMES кодировка» в начале скрипта. Если скриптов много – см. вариант 2.

2) Заставить MySQL автоматически выполнять этот запрос при каждом соединении с ним.
Для этого необходимо в конфигурационном файле MySQL, в секции [mysqld] добавить следующую строку: init-connect=»SET NAMES кодировка» .

Однако, следует заметить, что это НЕ будет работать, если пользователь, которым вы подключаетесь к базе имеет привилегию SUPER (а стандартный пользователь root к таким относится, так же как и все созданные через «GRANT ALL PRIVILEGES ON *.* TO . «). Это сделано для того, чтобы в случае ошибки в этом запросе (а его можно изменить во время работы), хоть кто-то мог подключиться к базе и исправить его.

Внимание! Функция mysqli_client_encoding() и сотоварищи, отображает кодировку клиента на момент соединения и не меняют возвращаемое значение в процессе работы. Поэтому не стоит кричать, что кодировка не меняется. Просто делайте, что говорят и смотрите результат работы скрипта. Получить нужное значение можно SQL-запросом «SHOW VARIABLES LIKE ‘character_set_client'» .

Читайте также:  Html link using post

3) Начиная с версий 4.1.15 и 5.0.13 добавить в секцию [mysqld] или [server] конфигурационного файла MySQL параметр skip-character-set-client-handshake . Этот параметр заставляет сервер игнорировать кодировку, посылаемую клиентом, и использовать указанную серверу. В примере конфигурации ниже этот параметр уже есть.

2. MySQL использует неверную кодировку

Симптомы:
Русский текст приходит в скрипт как русский, в консольном клиенте тоже все хорошо. Однако не работает сортировка, перевод в верхний/нижний регистр и т.д. Если применить решение из проблемы №1, то либо русский текст становится вопросами, либо mysql_error() возвращает сообщение похожее на «Illegal mix of collations (latin1_general_ci,IMPLICIT) and (cp1251_general_ci,COERCIBLE). «. В тоже время phpMyAdmin русский текст отображает как «крокозябры» (латинские символы с умляутами и т.д.).

Тестирование:
Попробуйте в phpMyAdmin’е выполнить запрос вида «SELECT CONVERT(CONVERT(поле USING binary) USING кодировка) FROM таблица» . Где «таблица» и «поле» — соответствующая таблица и поле с русским текстом, а «кодировка» — кодировка из проблемы №1.

Результат тестирования:

  • Если буквы (но необязательно слова) стали русскими, значит текст в базе лежал не в правильной кодировке и его нужно сконвертировать.
  • Если буквы стали русскими, а слова нет («бнопня»), значит неверно выбрана одна из русских кодировок – пробуйте другие, пока не получится русских слов.

Решение:
1) Установить для MySQL нужную кодировку по умолчанию.

Внимание! Это решение сработает сработает, только если кодировки не переопределены для базы, таблицы или столбца.
Для этого нужно в конфигурационном файле MySQL в секции [mysqld] добавить следующую строку:
default-character-set=cp1251

2) Сконвертировать таблицы в нужную кодировку.
Про то как конвертировать таблицы с неверными кодировками хорошо написано в мануале MySQL. Повторять здесь то же самое не к чему.

Дополнительно:

Конфигурационный файл MySQL — применяется для записи и хранения параметров программ MySQL, что исключает необходимость ввода этих параметров в командной строке при каждом вызове программы. Все определенные в конфигурационном файле параметры могут перекрываться параметрами, заданными в командной строке. В ОС UNIX в качестве конфигурационного файла используется my.cnf, в ОС Windows используется my.ini. Найти конфигурационный файл можно в корневой директории MySQL (см. местоположение конфигурационного файла MySQL). Внутри конфигурационных файлов параметры распределены по группам. Например:

[client]
user=sampadm
password=secret [mysqld]
port = 3306
socket = /tmp/mysql.sock
Названия групп заключаются в квадратные скобки и обычно соответствуют именам программ. Так, например, группа [mysqld] (в ранних версиях mysql — [server]) соответствует программе mysqld, являющейся сервером MySQL, который обеспечивает клиентским программам доступ к базам данных.
Читайте также:  Php compare arrays by keys

Источник

Русские буквы и символы в PHP скриптах и базе данных MySQL

Проблемы с кодировкой в PHP

Follow us on Twitter Follow us on rss

При использовании локального сервера на компьютере под управлением Windows, будь то Denwer или лбой другой набор, возникает проблема с отображением русских символов и букв при выводе страницы в браузер. Причины этой проблемы могут быть разными, в данной статье я расскажу о некоторых из них и постараюсь помочь с их решением.

Обычный вывод в PHP

Если не отображаются русские символы при обычном выводе через echo, появляются знаки вопроса (?) вместо букв, то проблемой может быть неверно указанная кодировка файла. Стандартная программа блокнот Windows по умолчанию сохраняет файл в кодировке ANSI, в результате чего появляется такая проблема как на картинке.

Знаки вопроса вместо букв

Знаки вопроса вместо букв

Решить проблему можно сохранив файл в формате UTF-8, для этого в блокноте достаточно нажать Файл->Сохранить как… и в появившемся окне выбрать тип файла «Все файлы» и выбрать кодировку UTF-8. После чего нажать кнопку сохранить и подтвердить замену файла.

Сохранение файла в кодировке UTF-8

Сохранение файла в кодировке UTF-8

Открываем вновь в браузере и видим, что проблема решена.

Нормальное отображение символов в PHP

Нормальное отображение символов в PHP

Этот способ показан для программы Блокнот Windows, т.к. чаще всего проблема возникает именно с ней у начинающих программистов PHP. Для программирования лучше использовать специальный текстовый редактор (Sublme Text, Notepad++ и др.) или IDE PhpStorm, они по умолчанию работают UTF-8.

Ошибки с русским текстом в базе данных MySQL

Проблема проявляет себя во время сохранения данных в базе данных MySQL. Обычно это происходит из-за того, что пользователь, при создании новой базы данных и таблицы, не выбирает сравнение(кодировку) и она устанавливается по умолчанию как latin1_swedish_ci.

СУБД возвращает ошибку при попытке добавить русский текст в поле записи.

#1366 — Incorrect string value

Ошибка при добавлении русского текста в запись таблицы СУБД MySQL

Ошибка при добавлении русского текста в запись таблицы СУБД MySQL

Чтобы не сталкиваться с такой проблемой необходимо всегда выбирать сравнение utf8_general_ci при создании базы данных, таблиц и столбцов.

Знаки вопроса при выводе данных из базы данных MySQL

Иногда возникает проблема с отображением данных, полученных из базы данных MySQL. Обычно вместо русских символов выводятся знаки вопроса.

Проблема решается путем установления кодировки подключения к базе данных.

Если вы пользуетесь старыми функциями для работы с БД MySQL, то сразу после функций подключения к базе данных необходимо добавить:

и при этом советую вам почитать про PDO, так как библиотека для работы с БД MySQL, включающая функции mysql_connect(), mysql_select_db() и прочие уже устарела, а в версии PHP 7 вообще убрана.

Если вы работаете с PDO, то в DSN(способ соединения с БД у PDO) необходимо в параметре charset устанавливать кодировку utf8. Пример соединения с кодировкой:

$ms_host = "localhost"; // Хост $ms_db = ""; // Имя БД $charset = "utf8"; // Кодировка соединения $dsn = "mysql:host=$ms_host;dbname=$ms_db;charset=$charset";

Если ничего не помогает

Попробуйте после подключения к БД добавить mysql_query(«SET NAMES utf8»);

Читайте также:  Css style all but last

Попробуйте в начале PHP скрипта добавить header(‘Content-Type: text/html; charset=utf8’);

А так же не забывайте о meta-теге между и

Буду рад, если кому-нибудь помогли данные советы. Вы можете задать вопрос со своей проблемой в комментарии и мы попробуем вместе разобраться. Удачи в устранении ошибок и багов!

Для вас это может быть интересно:

Русские буквы и символы в PHP скриптах и базе данных MySQL : 2 комментария

  1. Скейли 19.10.2016 Нормально отображаться русский текст начал только после указания кодировки UTF-8(без BOM) в notepad++, хотя meta charset использовал. Почему разрабы не могут проблемы кодировкой раз и навсегда решить, указывать приходится во всех местах. 🙁
  1. KoT 08.01.2021 А я использовал кодировку UTF-8 с BOM и так же нажимал преобразовать в UTF-8 с BOM и русский текст отобразился

Добавить комментарий Отменить ответ

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

  • Qt (4)
  • SEO (5)
  • Администрирование (4)
  • Алгоритмы (6)
  • Заработок (1)
  • Операционные системы (4)
  • Ответы (2)
  • Программирование (23)
  • Сайтостроительство (11)
  • Чынгыз к записи Как найти сумму и произведение элементов массива на C++
  • Чынгыз к записи Как найти сумму и произведение элементов массива на C++
  • Di к записи Создание Excel документа на PHP (генерация .xls файлов)
  • Илья к записи Русские символы(буквы) при вводе/выводе в консоль на C++
  • LedsHack к записи Найти максимальный и минимальный элемент массива на C++

Источник

Как поправить вывод русских символов из базы данных mysql?

5e90aae7e929a269730260.png

5e90af1cef17e507908238.png

в бд запись

FanatPHP

serginhold

Vaniljs, у тебя json выводится, возможно у объекта реализован метод __toString(), где внутри json_encode без JSON_UNESCAPED_UNICODE.
выведи просто echo $cat->name, все норм должно быть

Vaniljs

slo_nik

$json = '[]'; var_dump(json_decode($json, true));
array (size=2) 0 => array (size=6) 'id' => '398' (length=3) 'name' => 'цупывапывап' (length=22) 'description' => 'Дочь свергнутого короля Семи Королевств из династии Таргариенов Эйриса Безумного. ' (length=153) 'reason_murder' => 'Неприязнь' (length=18) 'killer' => 'Враждебный воин' (length=29) 'weapon' => 'Меч' (length=6) 1 => array (size=6) 'id' => '398' (length=3) 'name' => 'цупывапывап' (length=22) 'description' => 'Дочь свергнутого короля Семи Королевств из династии Таргариенов Эйриса Безумного. ' (length=153) 'reason_murder' => 'Неприязнь' (length=18) 'killer' => 'Враждебный воин' (length=29) 'weapon' => 'Меч' (length=6)

Vaniljs

Спасибо!
Подскажите, пожалуйста, как вывести конкретный ключ?
Допустим, id

$test = json_decode($json, true); echo $test->id;

Источник

Оцените статью