Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Кодировка для работы с БД (https://javascript.ru/forum/server/30100-kodirovka-dlya-raboty-s-bd.html)

Severtain 24.07.2012 10:38

Кодировка для работы с БД
 
Есть jQuery запросы, которые через PHP из базы возвращают
необходимые значение!
Столкнулся с проблемой, что английские тексты и символы работают, а когда использую русский возвращает "null"
На самой БД русский текст заносится, обрабатывается и работает адекватно, в чем может быть проблема ?

devote 24.07.2012 10:53

используйте кодировку UTF-8 и не будет проблем

Severtain 24.07.2012 10:57

<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
это?

devote 24.07.2012 10:57

сервер тоже должен работать с кодировкой UTF-8 и БД

Severtain 24.07.2012 11:02

Окей ! И как мне понять, какая кодировка стоит на БД и как ее переставить?
Хостинг и Домен на ukraine.com.ua

Маэстро 24.07.2012 18:41

Цитата:

Сообщение от Severtain (Сообщение 191165)
И как мне понять, какая кодировка стоит на БД?

В программе управления базой myadmin (phpMyAdmin) есть страница, показывающая параметры кодировки Вашего MySQL.
Там на странице MySQL (в самом корне всех страниц) должно быть написано
Кодировка сервера: UTF-8 Unicode (utf8)
Сопоставление кодировки соединения с MySQL: utf8_general_ci

x-yuri 24.07.2012 19:14

либо

<?php

mysql_connect('localhost', USER, PASSWORD);
$r = mysql_query("SHOW VARIABLES LIKE 'character_set%'");
echo '<table>';
while ($row = mysql_fetch_row($r)) {
    echo '<tr>';
    foreach ($row as $value) {
        echo '<td>' . $value;
    }
}
echo '</table>';


character_set_client, character_set_connection и character_set_results должно быть utf8. Если не utf8, тогда надо после подключения выполнить запрос: SET NAMES 'utf8'

devote 24.07.2012 19:21

после подключения к базе
mysql_query( "set session character_set_client=utf8;" );
mysql_query( "set session character_set_database=utf8;" );
mysql_query( "set session character_set_connection=utf8;" );
mysql_query( "set session character_set_results=utf8;" );
mysql_query( "set session collation_connection=utf8_general_ci;" );

x-yuri 24.07.2012 20:35

character_set_database - character set текущей БД, если ее и можно изменить, смысла в этом нету

set session character_set_connection=utf8; подразумевает set session collation_connection=utf8_general_ci; потому что utf8_general_ci - collation по умолчанию для character set utf8

SET по умолчанию изменяет переменные сессии, поэтому модификатор SESSION не обязательно указывать

достаточно SET NAMES 'utf8'

devote 24.07.2012 20:37

Цитата:

Сообщение от x-yuri
достаточно SET NAMES 'utf8'

увы но не всегда.. Были у меня проблемы с этим при использовании простого SET NAMES 'utf8', от того и стал делать так как написал выше.. Хуже от этого не стало, зато стабильно на любых настройках и любых базах работает.

Deff 24.07.2012 20:38

На самом деле имхо проблема часто не в этом - а в прописе в
http://habrahabr.ru/blogs/webdev/17640/
Цитата:

Цитата:

Просто не Хватает PHP скрипта на стороне сервера
Для GET запросов

Всё, что надо сделать, чтобы теперь работать
в PHP в
нормальной кодировке использовать iconv:

$f = iconv('UTF-8', 'windows-1251', $_GET['f']);
Цитата:

Для Post запросов
А для того, чтобы сервер отдавал яваскрипту в правильной кодировке (т.е. в такой же кодировке, в которой отдаются все xhtml страницы) просто в начале вашего ajax.php пропишите заголовок:

header('Content-type: text/html; charset=windows-1251');

И всё будет ок.


devote 24.07.2012 20:41

Deff,
если он использует методы json_encode/json_decode то с кодировкой windows-1251 они не работают, поэтому нужно кодировать данные для этих методов в кодировку utf-8.

9xakep 24.07.2012 20:44

А я для маленьких текстов (типа ников) Не стал мучиться и писал: escape(str), а на станице где надо вывести: unescape()

Deff 24.07.2012 21:28

Цитата:

Сообщение от devote
если он использует методы json_encode/json_decode

Черть её зает - посколь у ТС только указано jQuery Аякс (а я привел типовую ошибку на которую неоднократно нарывался, поэтому и привёл , посколь приходится просить править PHP кодеров

x-yuri 25.07.2012 00:35

Цитата:

Сообщение от devote
увы но не всегда.. Были у меня проблемы с этим при использовании простого SET NAMES 'utf8', от того и стал делать так как написал выше.. Хуже от этого не стало, зато стабильно на любых настройках и любых базах работает.

Не верю, что это было решением проблемы. А если и было, надо было разобраться в причине, я считаю. Танцы с бубном и уличная магия какие-то получаются. Так недалеко до:
if (true != false) {   // на всякий случай
    ...
}

Gozar 27.07.2012 23:52

Цитата:

Сообщение от x-yuri
надо было разобраться в причине

Возможно он знает причину и не говорит, ибо она банальна. Типа сделайте нам такой скрипт, но настройки на сервере у нас такие и доступа к ним мы вам не дадим.

x-yuri 28.07.2012 13:08

Настройки сессии нельзя изменить? Мне собственно и интересует. что там такого было, настройки это или не настройки. Возможно это было в период перехода на 5-ый mysql. По-моему там возникали проблемы типа "БД в кодировке X, а mysql думает, что она в кодировке Y", но вариант предлженный devote не похож на решение. Я думаю он не знает причину, или не помнит.

Цитата:

Сообщение от 9xakep
А я для маленьких текстов (типа ников) Не стал мучиться и писал: escape(str), а на станице где надо вывести: unescape()

Где и для чего? Она deprecated.

devote 28.07.2012 13:27

Цитата:

Сообщение от x-yuri
или не помнит.

вот именно что не помню причину. Ибо проблема эта возникала где-то в году 2008, и конечно же я уже не помню причины. Но на тот момент это было единственное быстрое решение, хотя конечно можно было решить работоспособность с set names но в тот момент нужно было решить вопрос быстро. И некогда было заморачиваться с чем либо.


Часовой пояс GMT +3, время: 12:57.