MySQL-query retourneert 0 rijen bij het zoeken naar waarde met punt (.) In reeks

Als ik in mysql-database naar een waarde probeer te zoeken en de tekenreekswaarde een punt bevat, retourneert de query 0 rijen. Voorbeeld:

SELECT * FROM table WHERE `username`='marco.polo'  --> 0 rows
SELECT * FROM table WHERE `username` LIKE '%.polo%'  --> 0 rows
SELECT * FROM table WHERE `username` LIKE 'polo'  --> Success

Dit verscheen na het verplaatsen van server en database naar een andere plaats. Ik weet dat de punt een reeks verlengde reguliere expressies is, maar het zou niet moeten gelden voor de operator equal of LIKE, gewoon omdat ik REGEXP niet gebruik bij het zoeken.

Ik heb dezelfde query op mijn lokale database getest en het werkt prima. Zou er een speciale instelling in MySQL kunnen zijn die punt anders behandelt dan gewoonlijk?

1

3 antwoord

Zoals @ cen al genoemd is, kan tekenset dat probleem veroorzaken. Ik heb dit voorbeeld gehad:

`email` VARCHAR(45) CHARACTER SET 'armscii8' NOT NULL,

dit was in de .sql-dump, die ik ontvang.

Dus toen ik probeerde om object op te halen met deze e-mail Ik kon het niet krijgen.

1
toegevoegd

user1084605, Ik probeerde het probleem te repliceren (met MySQL versie 5.1.37), maar kreeg precies de tegenovergestelde resultaten als jij. Zie hieronder:

mysql> create table test (username varchar(100));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into test values ('marco.polo');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM test WHERE `username`='marco.polo';
+------------+
| username   |
+------------+
| marco.polo | 
+------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM test WHERE `username` LIKE '%.polo%';
+------------+
| username   |
+------------+
| marco.polo | 
+------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM test WHERE `username` LIKE 'polo';
Empty set (0.00 sec)

According to the MySQL docs, the only special characters when using the LIKE operator are "%" (percent: matches 0, 1, or many characters) and "_" (underscore: matches one and only one character). http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

A "." (period) does have special meaning for MySQL's REGEXP operator, but it should still match a literal period in your column. http://dev.mysql.com/doc/refman/5.0/en/regexp.html

Kun je de SQL-instructies repliceren die ik hierboven heb uitgevoerd en je resultaten in antwoord plakken?

1
toegevoegd
Na uren foutopsporing kwam ik erachter dat de standaard tekenset van de tabel Armeens was (de maker heeft waarschijnlijk geen aandacht besteed aan het maken van de database, daarom is eerst op de lijst geselecteerd). Na het uitvoeren van een paar ALTER-instructies en het veranderen naar utf8 begon alles te werken. Bedankt voor de hulp toch!
toegevoegd de auteur cen, de bron

De onderstaande query zorgt voor het scenario wanneer we alleen de operator DOT in de kolommen hebben.

 SELECT * FROM test WHERE `username` LIKE '%.%';
0
toegevoegd