Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Duplikaty przy dodawaniu rekordów z polskimi znakami, gdzie istnieje taki rekord tylko bez polskich znaków
lukass
post 7.10.2012, 15:13:24
Post #1





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 20.03.2002

Ostrzeżenie: (0%)
-----


Witam,

mam problem przy jednej tabeli i zastanawiam się co może powodować dziwną sytuację. Mianowicie przy dodaniu do tabeli frazy bez polskich znaków i próba dodania takiej samej z polskimi znakami powoduje wywalenie 1062 i niemożność dodania takowego rekordu.

Tabela:

  1. CREATE TABLE `frazy` (
  2. `id_oph` INT(11) NOT NULL AUTO_INCREMENT,
  3. `hash` CHAR(10) DEFAULT NULL COLLATE 'utf8_unicode_ci',
  4. `phrase` VARCHAR(228) DEFAULT NULL COLLATE 'utf8_unicode_ci',
  5. PRIMARY KEY (`id_oph`),
  6. UNIQUE INDEX `hash_phrase` (`hash`, `phrase`)
  7. )
  8. COLLATE='utf8_unicode_ci'
  9. ENGINE=MyISAM


Połączenie z bazą zawiera:

  1. mysql_select_db($db_name,$mysql);
  2.  
  3. mysql_query("SET NAMES 'utf8'");
  4. mysql_query('SET CHARACTER SET utf8_unicode_ci');
  5. mysql_query('SET CHARACTER_SET_RESULTS="utf8"');
  6. mysql_query("SET time_zone = 'Europe/Warsaw';");


Ktoś zna przyczynę, dlaczego MySQL traktuje część polskich znaków jako niediakrytyczne?
Z tego co zauważyłem nie dotyczy to wszystkich znaków, np. ł nie łapie, natomiast ś, ą czy ó już wywala jako duplikat.
Go to the top of the page
+Quote Post
BaN
post 7.10.2012, 15:47:53
Post #2





Grupa: Zarejestrowani
Postów: 158
Pomógł: 43
Dołączył: 9.11.2007

Ostrzeżenie: (0%)
-----


Proponuję zmienić typ porównywania dla pola `phrase` na utf8_polish_ci
Go to the top of the page
+Quote Post
lukass
post 7.10.2012, 16:25:51
Post #3





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 20.03.2002

Ostrzeżenie: (0%)
-----


To pomogło, pytanie dlaczego unicode_ci nie rozróżnia tych znaków, chociaż powinien?

Co do zmiany, zamienię na utf8_bin, z tego względu, że trzymam tam też słowa w innych językach (np. niemieckie).
Go to the top of the page
+Quote Post
bostaf
post 7.10.2012, 16:51:55
Post #4





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

Ostrzeżenie: (0%)
-----


Cytat(lukass @ 7.10.2012, 17:25:51 ) *
To pomogło, pytanie dlaczego unicode_ci nie rozróżnia tych znaków, chociaż powinien?

Dokumentacja nie precyzuje tego zbyt dokładnie:
"utf8_general_ci collation are faster, but slightly less correct"... slightly less to nie jest pojęcie, którym posługuje się inżynier i które oznacza, że projektanci MySQL też nie bardzo wiedzą dlaczego tak się dzieje smile.gif Jest tam dalej przykład kilku różnych liter rozpoznawanych jako takie same. Trzeba z tym po prostu żyć, albo tak jak wykombinowałeś - zmienić kodowanie na utf8_bin.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:01