MySQL ucase() и lcase() в Win32

Profic

just Profic (PHP5 BetaTeam)
MySQL ucase() и lcase() в Win32

Сорри, но точного ответа на данный вопрос в форуме не нашел, если таковой имеется, просьба направить на соответствующий документ...

Вот приблизительный диалог с mysql (табуляции заменены на "=>"):
>SHOW VARIABLES LIKE 'character_set';
Variable_name => Variable_name
character_set => cp1251
>SELECT UCASE('абвгдеёжзийклмнопрстуфхцчшщъыьэюя') AS ucase;
ucase
абвгдеЁжзийкЛМнОПРсТУфхцчшщъЫьэюя
>SELECT LCASE('АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ') AS lcase;
lcase
АБВГДЕЁЖЗИЙКЛМНОПРСТуфХЦЧШщъЫЬЭЮЯ

Это то, что выдаёт MySQL (сервис mysqld-nt.exe) под WinXP (CE). Пробовал разные версии из ветки 3.23.x - результат один и тот же. Работает это все в связке с PHP 4.3.0 и Apache 2.0.50 (точно не помню, но последняя версия из ветки 2.0), но это явно не влияет на результат т.к. тоже самое получается и из под PHP и из консольного mysql...

Есть ли простое решение этой проблемы?
ЗЫ. Это моя конфигурация для разработок, все скрипты потом работают под Linux-ами разных версий и там данной проблемы не существует. Однако очень сильно надоедает... Я так понимаю, что по той же причине не работает регистронезависимый поиск через REGEX, хотя LIKE пашет нормально... В общем непонятное поведение MySQLd...
 

leosha

Старожил PHPCLub
Ф-ции преобразования регистра PHP тоже не верно работают. Ничего не сделаешь ты особо.. =(
Забить.
 

Profic

just Profic (PHP5 BetaTeam)
Автор оригинала: leosha
Ф-ции преобразования регистра PHP тоже не верно работают.
А вот тут позвольте не согласиться! Вот кусок кода:
PHP:
echo "<p>В верхний регистр";
$var = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
echo "<p>оригинал: ".$var;
echo "<p>результат: ".strtoupper ($var);
echo "<p>В нижний регистр";
$var = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ";
echo "<p>оригинал: ".$var;
echo "<p>результат: ".strtolower ($var);
И его вывод:
В верхний регистр
оригинал: абвгдеёжзийклмнопрстуфхцчшщъыьэюя
результат: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
В нижний регистр
оригинал: АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
результат: абвгдеёжзийклмнопрстуфхцчшщъыьэюя
Ничего не сделаешь ты особо.. =(
Забить.
Кстати у меня появилась идея, если она сработает, то зашлю результат
 

leosha

Старожил PHPCLub
Я сказал _ФУНКЦИИ_ а не какая-то определенная ф-ция.. =)
http://bugs.php.net/bug.php?id=21708
 

Profic

just Profic (PHP5 BetaTeam)
Автор оригинала: leosha
Ничего не сделаешь ты особо.. =(
Забить.
Как выяснилось, что не сделаешь :(
Вот цитата из mysql-ного мануала:
Here are some open issues for anyone who might want to help us with the Windows release:
...
- mysqld always starts in the "C" locale and not in the default locale. We would like to have mysqld use the current locale for the sort order.
Так что на MySQL придется забить
 

Profic

just Profic (PHP5 BetaTeam)
Автор оригинала: leosha
Я сказал _ФУНКЦИИ_ а не какая-то определенная ф-ция.. =)
http://bugs.php.net/bug.php?id=21708
Хм. Ну мне этой функцией пользоваться не приходилось...
Но результат удручает...
 

Profic

just Profic (PHP5 BetaTeam)
Автор оригинала: leosha
Кстати, по поводу: http://bugs.php.net/bug.php?id=21708
Если не лениво, попробуй сделать как там написано, плз.
У меня вообще прикол полный :)
PHP:
for ($i=0; $i < count ($str); $i++) {
 echo "<p>lower: ".ucwords (strtolower ($str[$i]));
}
В результате строки начинают вести себя как им захочется... Возможны практически любые варианты больших и маленьких букв. Есть вариант как в описании бага. Вот еще несколько вариантов:
lower: Просто
lower: ТюРЬма
lower: ЛЮБовнИк
lower: ЛЮБовнИк
lower: ЛУбОвнИк =)
lower: ЛЮДИ
lower: ЛЮДИ
или
lower: ПростО
lower: ТюРЬма
lower: ЛЮБовниК
lower: ЛЮБовниК
lower: ЛУбОвниК =)
lower: ЛЮДИ
lower: ЛЮДИ
И т.д. Странно всё это...
 

leosha

Старожил PHPCLub
Ага. Это с какой строкой setlocale?
Там, на самом деле все еще сложнее, ну да ладно.
Главное, это не мой локальный глюк - а то я засомневался уже, не зря ли разработчиков напрягаю.. =)
 

Profic

just Profic (PHP5 BetaTeam)
Автор оригинала: leosha
Ага. Это с какой строкой setlocale?
Там, на самом деле все еще сложнее, ну да ладно.
Главное, это не мой локальный глюк - а то я засомневался уже, не зря ли разработчиков напрягаю.. =)
Это со следующими строками setlocale
PHP:
setlocale (LC_COLLATE, "");
setlocale (LC_CTYPE, "");
setlocale (LC_TIME, "");
Этим кодом устанавливается локаль "Russian_Russia.1251"
У меня перед этим делается putenv с нужной локалью для Linux-а, и работает правильно как под виндой, так и под линухом...
 
Сверху