Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Бесит Женёк (кодировки, cp1251, utf8, буква ё)  [new]
netwind
Member [заблокирован]

Откуда:
Сообщений: 14267
В общем, более полный код, с использованием специального расширения php:
<?php
$s1 = 'женек';
$s2 = 'женёк';

$coll = collator_create( 'ru_RU.UTF-8' );
collator_set_strength( $coll, Collator::SECONDARY );
#collator_set_strength( $coll,  Collator::PRIMARY );

$res  = collator_compare( $coll, $s1, $s2 );

if ($res === false) {
    echo collator_get_error_message( $coll );
} else if( $res > 0 ) {
    echo "s1 is greater than s2\n";
} else if( $res < 0 ) {
    echo "s1 is less than s2\n";
} else {
    echo "s1 is equal to s2\n";
}
?>
Тестируя и выбирая разные strength, можно понять что по-умолчанию в php используется secondary difference (что не отличается от поведения функции mb_stristr по крайней мере для русского).

А в mysql, стало быть, выбрали primary без возможности её указать.
24 ноя 11, 13:33    [11651159]     Ответить | Цитировать Сообщить модератору
 Re: Бесит Женёк (кодировки, cp1251, utf8, буква ё)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3683
netwind,

вы без банальностей недопонимаете, опять уперлись рогом в стену
НАБОР символов UTF8 - один для PHP и для MySQL, т.е. и MySQL Е и Ё хранятся как разные симолы, НО
в MySQL для сравнения используется свой РЯД - "collation"
вашими устами, только все это относится к collation
В общем, согласно табличкам, действительно в cp1251 е не эквивалетна Ё, а в utf8 - эквивалентна.
http://www.collation-charts.org/winxp/winxp.0400.CP1251.Russian_Russia.html
http://www.collation-charts.org/mysql60/mysql604.utf8_unicode_ci.european.html
(эквивалентные символы показаны рядом бледненьким цветом)
единственный минус utf8_bin - символы ё,Ё не на "своих" местах
это вам уже советовали:
mahoune
...Можно попробовать пересобрать MySQL поправив исходники...

можете посмотреть здесь => adding-collation
в MySQL 5.6 появилась ф-я weight_string, с ней все вам станет понятно, что - как - и с чем сравнивается на данный момент...
24 ноя 11, 15:20    [11652210]     Ответить | Цитировать Сообщить модератору
 Re: Бесит Женёк (кодировки, cp1251, utf8, буква ё)  [new]
netwind
Member [заблокирован]

Откуда:
Сообщений: 14267
Alex_Ustinov, если я назвал ваши слова банальностью, то значит как раз таки понимаю.
мой вопрос в другом :
почему в разных частях фактически единой платформы LAMP, выбраны разные правила?
давайте кого-нибудь накажем за это . например, повесим в багтрекер неразрешимый баг навечно.
24 ноя 11, 15:27    [11652274]     Ответить | Цитировать Сообщить модератору
 Re: Бесит Женёк (кодировки, cp1251, utf8, буква ё)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3683
netwind,

согласен, давайте накажем, только кого - это community-server . но на баг треккере это висит где-то с 2002-2003 года. Посмотрелв MariaDB - то же самое, значит ничего в этом направлении не сделано. Может быть Большинство такой расклад устраивает, может не придают значение. Вариант - сделать свой collation utf8-russian... и предложить сообществу :-)
Сам кувыркался с данной проблемой, в итоге пересел на родину - cp1251, там где это было остро необходимо.
24 ноя 11, 15:42    [11652473]     Ответить | Цитировать Сообщить модератору
 Re: Бесит Женёк (кодировки, cp1251, utf8, буква ё)  [new]
netwind
Member [заблокирован]

Откуда:
Сообщений: 14267
Alex_Ustinov, тот баг они не считают багом. его не починят.
просто избрали для mysql первичную степень сравнения и зафиксировали её в collation utf8_unicode_ci.
24 ноя 11, 16:04    [11652750]     Ответить | Цитировать Сообщить модератору
 Re: Бесит Женёк (кодировки, cp1251, utf8, буква ё)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3683
netwind,

покопался немного с этой проблемой.
+
подправил .../charsets/index.xml
<charset name="utf8">
  <family>Unicode</family>
  <description>UTF-8 Unicode</description>
  <alias>utf-8</alias>
  <collation name="utf8_general_ci"	id="33">
   <flag>primary</flag>
   <flag>compiled</flag>
  </collation>
  <collation name="utf8_bin"		id="83">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
/* добавил ------------------------*/  
<collation name="utf8_russian_ci" id="250">
   <rules>
    <reset>\u0415</reset><p>\u0401</p> <!-- ЕЁ --> 
    <reset>\u0435</reset><p>\u0451</p> <!-- её -->	
  </rules>
 </collation>
/*  ---------------------------*/  
  </charset>
при выборке полей из таблиц символы Ее и Ёё - различаются
CREATE TABLE qwe(
  id INT(11) NOT NULL AUTO_INCREMENT,
  nm_rus CHAR(20) CHARACTER SET utf8 COLLATE utf8_russian_ci DEFAULT NULL,
  nm_utf VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (id)
);
INSERT INTO qwe VALUES (NULL,'елка','елка'), (NULL,'ёлка','ёлка');
SELECT * FROM qwe WHERE nm_rus = 'ёлка';


id          nm_rus               nm_utf
------------------------------------
2           ёлка                 ёлка


SELECT * FROM qwe WHERE nm_utf = 'ёлка';

id          nm_rus               nm_utf
----------- -------------------- ---------------------------------
1           елка                 елка
2           ёлка                 ёлка
и сортировка тоже в порядке

так что если вам регистрозависимость неважна и есть доступ к системе - вроде как спасение
26 ноя 11, 15:22    [11663963]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / MySQL Ответить