Mysql, Utf8, Php, запрос like

yelenabun

Новичок
Mysql, Utf8, Php, запрос like

Здравствуйте, такая проблема:
данные в таблицах в mysql в кодировке utf8_unicode_ci. На пхп страницах все данные на разных языках отображаются корректно, т.е. выставлены хидеры с кодировкой ютф8. Вопрос в следующем, как выполнить запрос типа

select <field name> from <table name> where <field name> like '$value%';

value здесь выглядит как '%u0442', например, т.к. она приходит на сервер со страницы с кодировкой ютф, только вот данные в таблице отображаются в виде символов - 'ГђВєГ‘Ж’ГђВєГ‘Ж’ГђВ¶Г‘Ж’ГђВ¶Г‘Ж’'

Пробовала
SET NAMES utf8;

проверяла:

SELECT CONVERT(CONVERT(title USING binary) USING utf8) FROM news

все остается неизменным.
Как сравнить эти данные?

З.Ы. пхп 5, масиквел 4.1.16
 

WP

^_^
Для перевода %uXXXX в UTF-8 нечто вроде того:
PHP:
function _ucs2EntitiesDecode($data)
{
 if (is_array($data))
 {
  $d = array();
  foreach ($data as $k=>$v) {$d[$this->_ucs2EntitiesDecode($k)] = $this->_ucs2EntitiesDecode($v);}
  return $d;
 }
 else
 {
  if (strpos($data,'%u') !== FALSE) {$data = preg_replace_callback('~%u([0-9A-F]{1,4})~i','_ucs2EntitiesDecodeCallback',$data);}
  return $data;
 }
}
function _ucs2EntitiesDecodeCallback($p)
{
 static $mnemonic = FALSE;
 $hex = $p[1];
 $dec = hexdec($hex);
 if ($dec === '38') {$c = '&amp;';}
 else
 {
  if (is_callable('iconv')) {$c = @iconv('UCS-2BE','UTF-8',pack('n',$dec));}
  else {return FALSE;}
  if (!strlen($c)) {if ($mnemonic) {$c = '&#'.$dec.';';} else {$c = '?';}}
 }
 return $c;
}
function hecho($string) {return preg_replace('#.#se','sprintf("\\x%02x",ord("$0"))',$string);}

$value = '%u0442';
$result = _ucs2EntitiesDecode($value);
echo hecho($result); // \xd1\x82
-~{}~ 16.08.06 00:35:

И конечно будет полезно - http://phpclub.ru/faq/Mysql41Rus
 

yelenabun

Новичок
все, разобралась.

нашла в мануале функцию:


function unescape($str) {
$str = rawurldecode($str);
preg_match_all("/(?:%u.{4})|&#x.{4};|&#\d+;|.+/U",$str,$r);
$ar = $r[0];
print_r($ar);
foreach($ar as $k=>$v) {
if(substr($v,0,2) == "%u")
$ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));
elseif(substr($v,0,3) == "&#x")
$ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1)));
elseif(substr($v,0,2) == "&#") {
echo substr($v,2,-1)."<br>";
$ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1)));
}
}
return join("",$ar);
}

echo unescape('%u0442'); //т


всем большое спасибо...
 

WP

^_^
yelenabun
> а что ж делать?
Как минимум не использовать/не писать код за который убивают.
> как по другому?
Это я написал в первом посте :)
 

yelenabun

Новичок
))) да ужжж... сорри..
простите, еще вопрос - ваша фунуция возвращает \xd1\x82 и т.д., а как тогда запрос строить?

select <field name> from <table name> where <field name> like '\xd1\x82%'

?
в базе то все в символах...

спасибо.
 

WP

^_^
> ))) да ужжж... сорри..
> простите, еще вопрос - ваша фунуция возвращает \xd1\x82 и т.д., а как тогда запрос строить?
Ничего) Со мной можно "на ты". Я специально объявил переменную $result чтобы показать тем самым что нужно использовать в запросе. А функция hecho лишь показывает переданный ей аргумент побайтно, и демонстрирует в данном случае что в $result лежит unicode.
Но в LIKE можно передать и такую последовательность :) Все равно. Только если будете передавать $result (без hecho), то не забудьте про экранирование этих символов, которые являются служебными (в конструкции LIKE % и _, они здесь тоже учтены): "\x00", "\n", "\r", '\\', '\', '"', '%', '_'
Функция экранирования:
PHP:
function sqlescape_full($string)
{
 static $sqlescape = array(
	"\x00"=> '\x00',
	"\n"	=> '\n',
	"\r"	=> '\r',
	'\\'	=> '\\\\',
	'\''	=> '\\\'',
	'"'	=> '\\"',
	'%'	=> '\%',
	'_'	=> '\_'
 );
 return strtr($string,$sqlescape);
}
-~{}~ 16.08.06 18:01:

отображаются в виде символов - 'ГђВєГ‘Ж’ГђВєГ‘Ж’ГђВ¶Г‘Ж’ГђВ¶Г‘Ж’'
Любой текст отображается в виде символов. А то что Вы привели, это результат неверного перевода из одной кодировки в другую или неверного определения кодировки.
в базе то все в символах...
Не в символах, а в байтах :) Символ это уже более высокоуровневое понятие. А байты можно также передать СУБД MySQL (Системе Управления Базой Данных) в виде escaped-последовательности.
 

yelenabun

Новичок
спасибо за хелп! заиспользовала _ucs2EntitiesDecode(), все летает на ура :)

-~{}~ 22.08.06 14:31:

Я вернулась :))
WP
Твоя функция работает только с английскими стрингами :(, а та что я давала со всеми....
 
Сверху