2016-05-24 7 views
4

Was haben wir einen Tisch mit einer E-Mail-Feld ist - Sortierungs latin1_swedish_ci aufgrund der Einschränkungen unserer E-Mail-Service.Überprüfen Sie, ob Eingabestring mit DB Sortierungs entspricht

Full table description

Diese Tabelle wird geprüft, wenn ein neuer Benutzer zu sehen kommt, wenn er bereits abonniert wurde.

Kommt entlang einem Benutzer mit Zeichen in ihrer E-Mail, die für diese spezielle Zusammenstellung nicht gültig wäre. Nehmen wir zum Beispiel hsı[email protected]

enter image description here


Wäre es möglich, vor dem Speichern, um zu bestimmen, ob ein String wird der Vergleichsregeln der Datenbank haften?

Ist es möglich für mich vor jedem DB-Trigger zu überprüfen, speichern/erstellen/finden; Wenn ein Eintrag mit dieser bestimmten E-Mail-Adresse mit der Sortierung übereinstimmt? Irgendeine Regex vielleicht?

+0

Rails Standardsammlung wird auf 'utf8_general_ci' gesetzt. Möchten Sie die gesamte Rails-Anwendung ändern, um 'latin_swedish_ci' zu verwenden. – coderhs

+0

@Coderhs die gesamte Anwendung verwendet bereits 'latin_swedish_ci'.Ich möchte nur nicht eine DB-Abfrage ausführen, wenn der Eingabewert nicht unterstützt wird – Sinstein

+0

Ist E-Mail-System die gemeinsame Nutzung der Datenbank mit Ihrer Rails-Anwendung? Die ganze Anwendung auf "latin_swedish_ci" zu verurteilen, scheint eine ziemlich harte Lösung zu sein. – max

Antwort

1

In Ruby können Sie String#encode verwenden, um Konvertierungszeichenfolgen zwischen gemeinsamen Codierungen zu testen.

Dies wird jedoch nicht helfen, da Sie eine MySQL-spezifische Sortierung testen möchten.

Was können Sie tun, ist zu verwenden, um einen transaction:

User.transaction do 
    if User.create!(email: 'hsı[email protected]') 
    puts "yup its valid" 
    raise ActiveRecord::Rollback 
    end 
end 

aber es nicht sehr effektiv ist. Wenn Sie möchten, dass es vor dem Speichern ausgeführt wird, können Sie eine benutzerdefinierte Validierung verwenden.

Wenn möglich würde ich den MySQL-Standard utf und utf8_general_ci verwenden und nur an der Anwendungsgrenze konvertieren, wo es mit dem E-Mail-System interagieren muss. Die Verwendung einer Nicht-UTF-8-Codierung wird Ihnen viele Kopfschmerzen bereiten und auf lange Sicht sehr schädlich sein, wenn beispielsweise das fehlerhafte E-Mail-System geändert wird.

Sie können mit on the fly wählen collate:

SELECT users.email COLLATE latin1_swedish_ci AS users.collated_email 
FROM users 
+0

Verwenden von Ruby 1.8.7 - also keine Verwendung von encode. Das Ändern der Sortierung wäre ein Problem, da Latin derzeit die Standardsortierung ist. Das Ändern der gesamten db würde ich vermeiden. – Sinstein

+0

Sie müssen Ihr Ruby ASAP aktualisieren. 1.8.7 wurde 2013 zurückgezogen und hat viele Sicherheitslücken und ist viel langsamer als 2.x. – max

+0

Ja, ich bin mir bewusst. Infact Ein Ruby and Rails Upgrade ist etwas, auf das wir vorbereitet sind und das in ein paar Wochen erledigt sein wird. Dieses Problem muss noch separat behandelt werden. – Sinstein

0
RoR: application_controller.rb 

    def configure_charsets 
    response.headers["Content-Type"] = "text/html; charset=utf-8" 
    suppress(ActiveRecord::StatementInvalid) do 
     ActiveRecord::Base.connection.execute 'SET NAMES UTF8' 
    end end 

Sie sollten mit UTF-8 gehen (oder utf8mb4), nicht die sehr begrenzte latin1 (nur Westeuropa behandelt).

ALTER TABLE user_subscriptions 
    CONVERT TO utf8; 

(auch für andere Tabellen).

Ihr Titel spricht über die Überprüfung. Aber ich denke, wenn man alles mit dem gleichen CHARACTER SET bekommt, muss man nicht "checken".

0

Versuchen Sie mit Ballauffrage. Es kann Ihnen helfen.

 
select * from user_subscription where email=cast('hsı[email protected]' as char CHARSET latin1);