hoofdletter gevoelig?
Beste leden,
Kan het kloppen dat een mysql equals operator niet kijkt naar hoofdletters?
Een simpele test:
Users:
id, username
1, merijn
Nu de query:
SELECT * FROM users WHERE username = 'Merijn'
Geeft gewoon 1 rij terug. Kan iemand dit bevestigen en wellicht een oplossing geven?
Met vriendelijke groet,
Merijn
Toevoeging op 05/02/2011 03:41:56:
Sorry voor de bump, ben er achter, stond niet op Binary ingesteld.
Kan het kloppen dat een mysql equals operator niet kijkt naar hoofdletters?
Een simpele test:
Users:
id, username
1, merijn
Nu de query:
SELECT * FROM users WHERE username = 'Merijn'
Geeft gewoon 1 rij terug. Kan iemand dit bevestigen en wellicht een oplossing geven?
Met vriendelijke groet,
Merijn
Toevoeging op 05/02/2011 03:41:56:
Sorry voor de bump, ben er achter, stond niet op Binary ingesteld.
Dat heeft met de collation van je tabel te maken.
Zie: http://dev.mysql.com/doc/refman/5.1/en/charset-general.html
Zie ook : http://dev.mysql.com/doc/refman/5.1/en/charset-mysql.html
Dat "_ci" staat dus voor niet hoofdletter gevoelig.
Binary heeft volgens de meeste eenvoudige collation daar worden karaters binair met elkaar vergeleken. Dan is 'a' binair anders dan 'A', dus hoofdletter gevoelig.
Quote:
A collation is a set of rules for comparing characters in a character set.
Zie: http://dev.mysql.com/doc/refman/5.1/en/charset-general.html
Zie ook : http://dev.mysql.com/doc/refman/5.1/en/charset-mysql.html
Dat "_ci" staat dus voor niet hoofdletter gevoelig.
Quote:
Sorry voor de bump, ben er achter, stond niet op Binary ingesteld.
Binary heeft volgens de meeste eenvoudige collation daar worden karaters binair met elkaar vergeleken. Dan is 'a' binair anders dan 'A', dus hoofdletter gevoelig.
Gewijzigd op 05/02/2011 11:11:22 door Martijn B
Jep ben er achter, de default charset staat op swedish_ci waar ci staat voor: Case Insensitive. Volgende de mysql Docs hoort een _bin charset wel hoofdletter gevoelig te zijn maar ook hier klopt iets niet helemaal.
Stel ik heb een user account met "Merijn" en ik wil later een account toevoegen "merijn", dan krijg ik alsnog de error dat de naam al in gebruik is. Oftewel, case insensitive. Het geldt dus ook voor het aanmelden. Ik kan gewoon nog aanmelden met "merijn" op het user account "Merijn". Behoorlijk frustrerend omdat ik geen duidelijke oplossing vinden kan.
Overigens, de default charset is nu: utf8_bin
Stel ik heb een user account met "Merijn" en ik wil later een account toevoegen "merijn", dan krijg ik alsnog de error dat de naam al in gebruik is. Oftewel, case insensitive. Het geldt dus ook voor het aanmelden. Ik kan gewoon nog aanmelden met "merijn" op het user account "Merijn". Behoorlijk frustrerend omdat ik geen duidelijke oplossing vinden kan.
Overigens, de default charset is nu: utf8_bin
En de charset van de tabel? Volgens mij kan je in mysql per tabel de charset definiëren.
Alles staat nu op _bin. Zowel de tabellen alsook de database. Ik heb de tabellen geflushed en opnieuw opgebouwd om te kijken of het uitmaakt, maar het werkt niet. Erg vervelend, waarschijnlijk zie ik iets over het hoofd. Maar wat, dat weet ik dan weer niet.
Ik heb een tabel gemaakt en op de kolom naam zit een unieke index.
De tabel:
Ik heb er 2 gebruikers in gezet:
Als ik nog een gebruiker 'martijn' toevoeg dan krijg ik uiteraard een error.
Ik heb een selectie gedaan:
En zoals verwacht kwam er 1 gebruiker uit namelijk 'martijn'.
Dit alles gedaan in phpMyAdmin 3.1 en de 'MySQL verbindingscollatie' op 'utf8_bin'.
De tabel:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
CREATE TABLE test (
id int( 10 ) unsigned NOT NULL auto_increment,
naam varchar( 255 ) NOT NULL default '',
PRIMARY KEY ( id ),
UNIQUE INDEX u1 ( naam )
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
id int( 10 ) unsigned NOT NULL auto_increment,
naam varchar( 255 ) NOT NULL default '',
PRIMARY KEY ( id ),
UNIQUE INDEX u1 ( naam )
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
Ik heb er 2 gebruikers in gezet:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
INSERT INTO `test`.`test` (
`id` ,
`naam`
)
VALUES (
NULL , 'martijn'
), (
NULL , 'Martijn'
);
`id` ,
`naam`
)
VALUES (
NULL , 'martijn'
), (
NULL , 'Martijn'
);
Als ik nog een gebruiker 'martijn' toevoeg dan krijg ik uiteraard een error.
Ik heb een selectie gedaan:
En zoals verwacht kwam er 1 gebruiker uit namelijk 'martijn'.
Dit alles gedaan in phpMyAdmin 3.1 en de 'MySQL verbindingscollatie' op 'utf8_bin'.
Dat klopt, maar ik ga m`n database niet opnieuw creeren om zodoende alles op utf8 te krijgen. Naar het * schijnt * staat alles op utf_bin, maar ik ben er achter gekomen dat elk individueel veld ook nog een charset mee krijgt. Een simpele query om alle velden ook UTF8 te maken, leverde het volgende op:
id , username
1 , merijn
SELECT * FROM users WHERE username = 'merijn' // levert 1 ( true )
SELECT * FROM users WHERE username = 'Merijn' // levert 0 ( false )
Conclusie: alle velden moeten zelf ook nog weer geencode worden naar de goede charset. Best handig om te weten, dom dat ik niet in het begin alles op utf8 heb gezet. Fout die niet snel gemaakt wordt nu :)
id , username
1 , merijn
SELECT * FROM users WHERE username = 'merijn' // levert 1 ( true )
SELECT * FROM users WHERE username = 'Merijn' // levert 0 ( false )
Conclusie: alle velden moeten zelf ook nog weer geencode worden naar de goede charset. Best handig om te weten, dom dat ik niet in het begin alles op utf8 heb gezet. Fout die niet snel gemaakt wordt nu :)




