UTF-8 и русский текст. UPPER и сравнение не работают

Сенсей

Новичок
UTF-8 и русский текст. UPPER и сравнение не работают

Таблица :

PHP:
CREATE TABLE `cms_users_tags` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `text` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `txt` (`text`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Collation: utf8_general_ci

Мне нужно просто проверить существует ли введенный тег в таблице. По идее utf8_general_ci - регистронезависимый. Но - увы он у меня отличает Вася от вася

Решил пойти по другому - принудительно вривести все в верхний регистр и заюзать. Но тут тоже проблема.


PHP:
$res = sql_query("select UPPER(text) from ".$prefix."_users_tags limit 10", $dbi);
while(list($text) = sql_fetch_row($res))
{
	echo "$text<br>";
}
Английские буквы все нормально апперкейсит. А вот русские буквы - просто коверкает:

Код:
Ўран
Ўрот
Ўр&#65533;?&#65533;?да
Ашдод
Ашк&#65533;?лон
Атлит
Аф&#65533;?ла
Арад

Куда копать не знаю...

Всякие

mysql_query('SET names=utf8');
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_connection=utf8');
mysql_query('SET character_set_results=utf8');
mysql_query('SET collation_connection=utf8_general_ci');

Не помогают

Гуглил, да и тут искал. В голове каша получилась. Не как не пойму - это проблема Mysql, Апача или же PHP?

И связано ли это setlocale?

И самый интересный овпрос - почему utf8_general_ci - регистрозависим у меня.
2 дня бьюсь уже головой об стенку...

p.s
При выводе локалей по system('locale -a'); выдает:

Array ( [0] => C POSIX e [1] => _US.utf8 )
 

Сенсей

Новичок
реально там NAMES - но это не важно. после этой устновки вывод вообще превращается в

&#208;&#352;&#208;&#178;&#208;°&#209;?-&#208;&#161;&#208;°&#208;±&#208;°
&#208;&#352;&#208;&#178;&#208;°&#209;?-&#208;&#165;&#208;°&#208;±&#208;°&#209;‚
&#208;&#352;&#208;&#184;&#209;?&#209;&#338;&#209;&#143;&#209;‚-&#208;&#352;&#208;°&#209;?&#208;&#188;&#208;&#924;&#208;&#188;
 

Сенсей

Новичок
Ну очепятался я .. вот реально что не помагает вообще:

//mysql_query('SET NAMES utf8');
//mysql_query("SET CHARACTER SET 'utf8'");
mysql_query('SET character_set_client=utf8');
mysql_query('SET character_set_connection=utf8');
//mysql_query('SET character_set_results=utf8');
mysql_query('SET collation_connection=utf8_general_ci');
return $dbi;

select title -> выдаст - Кацрин
select UPPER(title) -> выдаст - Њацрин

Если расскоментировать любую из 3 ех закомментированых строчек... то:

select title -> выдаст - &#208;&#353;&#208;°&#209;†&#209;?&#208;&#184;&#208;&#189;
select UPPER(title) -> выдаст - &#208;&#352;&#208;°&#209;†&#209;?&#208;&#184;&#208;&#189;

p.s

Я вкурсе что:

A SET NAMES 'x' statement is equivalent to these three statements:

SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

Просто чято только я уже не пробовал...
 

Сенсей

Новичок
Bitterman
ну php я могу перевести текст который пришел от юзера... но ведь чтоб сравнить его с текстом в базе - я должен и текст в базе тоже преобразовать в верхний регистр.

p.s
в php тоже проблема с этим... а mb_ не стоит.. но это я максимум пока обхожу str_replace и массивом букв... но ведь все равно в базе нужно поле тоже преобразовать что бы было с чем сравнивать..
 

Bitterman

Новичок
Так считай из базы, преобразуй в скрипте и запиши обратно, раз уж прямо в базе не получается. Что мешает?
 

Сенсей

Новичок
Bitterman
то есть вместо

PHP:
$res = sql_query("select count(*) from ".$prefix."_users_tags where UPPER(text)=UPPER('".$get_text."')", $dbi);
Тф предлагаешь выбрать мне все в массив и проверять если существует в массиве нужное значение? А если в таблице 1000 саписей? Для базы фигня... а загонять в массив это.. или же циклом проверять... это лишнее...
 

vovanium

Новичок
Сенсей
А у тебя UTF-8 изначально в таблице был или конвертил? Ты уверен что у тебя в таблице данные в правильной кодировке?

Смущает твое "Всякие" насчет SET NAMES, хотя оно должно быть таким же обыкновенным, как и коннект к базе. А с твоих слов создается впечатление, что ты его начал использовать только при этих селектах.

Попробуй ради интереса создать в phpmyadmin свою таблицу, и оттуда же добавить 'Вася' и 'вася'.

Проверь данные перед тем как придумывать костыли с UPPER.
 

Сенсей

Новичок
vovanium
База была взята с работающего проэкта... который был в кодировке cp1251 и сравнении - cp1251_general_ci - ну и естественно кодировка и collation были изменены на utf8 и utf8_general_ci соответственно..

Вот так прикол... создал тестовую таблицу как ты сказал... с кодировкой и сравнением utf8 - и все отлично заработало...

правда с mysql_query('SET NAMES utf8');

но по идее так и должно быть...

Значит изменить != создать?

з.ы
Снес щас своб таблицу... создал заного с utf8 и utf8_general_ci - не жизнь а сказка. Спосибо за помощь. Но хотелось бы все таки знать почему так происходит...

з.ы.з.ы
Сколько же сигарет было выкурено в армии пока пытался решить эту проблему =)
 

Bitterman

Новичок
Тф предлагаешь выбрать мне все в массив и проверять если существует в массиве нужное значение? А если в таблице 1000 саписей? Для базы фигня... а загонять в массив это.. или же циклом проверять...
Ну вообще-то я тебе предлагал таким образом переконвертить значения в таблице. Один раз, а не делать это каждый раз при поиске.
 

vovanium

Новичок
Но хотелось бы все таки знать почему так происходит
Так происходит потому что изменять кодировку нужно тоже правильно ;) Как именно менял кодировку на utf-8?

правда с mysql_query('SET NAMES utf8');
Так так и должно быть, иначе у тебя будет кодировка соединения latin1, отсюда и косяки со сравнениями, т.к. MySQL думал что ты ему даешь данные в latin1, а ты давал cp1251.
 
Сверху