4 Stimmen

Warum funktioniert UPPER() in MySQL nicht?

Meine SQL-Abfrage wählt einige Spalten aus einer Ansicht mit einem optionalen Sortierfeld aus. Im Grunde genommen verkettet meine Ansicht eine Reihe von Feldern zu einer einzigen Adresszeichenkette, so dass ich am Ende etwas erhalte wie

123 Sesame Street Birdtown

in der Adressspalte. Ich möchte, dass bei der Suche die Groß- und Kleinschreibung nicht beachtet wird (standardmäßig ist das nicht der Fall), also habe ich Folgendes versucht:

SELECT * FROM BasicJobInfo WHERE UPPER(address) LIKE UPPER(searchString)

wobei searchString die Adresse ist, die ich finden möchte. MySQL scheint jedoch nicht in der Lage zu sein, die Adresse in Großbuchstaben zu konvertieren - ich habe versucht, einfach die

SELECT UPPER(address) FROM BasicJobInfo

aber das ändert nichts an der Sache. Haben Sie eine Idee, woran das liegen könnte?
Haben Sie noch andere Vorschläge, wie ich eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung durchführen kann?
Vielen Dank!

0 Stimmen

Können Sie eine Beschreibung von BasicJobInfo beifügen? Ich verwende Oracle, nicht MySQL, aber könnte es sein, dass der ursprüngliche Datentyp "upper" nicht unterstützt und erst bei der Ausgabe in einen String konvertiert wird?

15voto

Dave Webb Punkte 184809

Selon le MySQL-Referenzhandbuchseite zu String-Funktionen :

UPPER() ist unwirksam bei der Anwendung auf binäre Zeichenketten (BINARY, VARBINARY, BLOB).

Ist es möglich, dass Ihr ADDRESS Spalte hat eine BINARY , VARBINARY ou BLOB Datentyp?

Wenn dies der Fall ist, müssen Sie den Binary String in einen "normalen" String umwandeln . Zum Beispiel:

UPPER(CONVERT(ADDRESS USING latin1))

0 Stimmen

Nur zur Klarstellung: Es gibt keine BINARY-, VARBINARY- oder BLOB-Typen - die Adresse ist lediglich eine Verkettung mehrerer INT- und VARCHAR-Felder, keine Ahnung also, warum dies notwendig war.

1voto

Quassnoi Punkte 396418

Bitte führen Sie die folgenden Abfragen durch:

SELECT  @@character_set_server, @@collation_server

SELECT  HEX(CAST(UPPER(address) AS binary)), HEX(CAST(address AS binary))
FROM    BasicJobInfo

0 Stimmen

Latin1, latin1_swedish_ci 31323320436172726F747320506572746820, 31323320436172726F747320506572746820 Die letzten beiden sind genau gleich.

1voto

soulmerge Punkte 70900

Dies könnte auf Kodierungsprobleme zurückzuführen sein. Die Durchführung von Vergleichen ohne Berücksichtigung der Groß- und Kleinschreibung wird in der Anhang zu den mysql-Hilfeseiten . Beispiel für den Vergleich von UTF8-Spalten/Zeichenfolgen ohne Berücksichtigung der Groß-/Kleinschreibung:

SELECT *
FROM YourTable
WHERE address LIKE 'searchString' COLLATE utf8_general_ci;

0voto

Was bei mir funktioniert hat, war die Verwendung des Schlüsselworts binary

  SELECT *
  FROM Table
  WHERE binary address = 'caseSensitiveString' ;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X