2012-11-23 15 views
9

Uno script in Python non ha funzionato e ho ridotto il problema a quanto segue.'P 0' <'P! 'in python e postgresql

in PostgreSQL 9.1 ho provato:

SELECT 'P 0' < 'P! ' 
f 

E in Python 2.7.3:

>>> 'P 0' < 'P! ' 
True 

Perché ' ' non inferiore '!' in PostgreSQL? Che cosa sta succedendo?

+3

controllare ciò che dal locale il database sta usando. I confronti tra stringhe dipendono dal modo in cui le regole di confronto vengono eseguite nelle impostazioni internazionali correnti. – hammar

+0

Sono abbastanza sicuro che non sia dovuto alla localizzazione. – kennytm

+1

@KennyTM: alcune impostazioni locali ignorano gli spazi durante la fascicolazione, il che spiegherebbe la differenza in questo caso. – hammar

risposta

7

PostgreSQL sta utilizzando le regole di confronto delle impostazioni internazionali per il confronto delle stringhe. Python utilizza una diversa localizzazione (possibilmente "C") per le regole di confronto.

E 'difficile dire di più senza sapere che cosa il database LC_COLLATE è (da \l+ in psql) e ciò che il vostro ambiente di runtime per Python è. Prova a mostrare le impostazioni internazionali del database e l'output del comando shell locale.

Vedere the PostgreSQL documentation on locales.

Per esempio, confrontare e contrapporre:

-- results may vary depending on your OS/libc 
SELECT 'P 0' < 'P! ' COLLATE "C"; -- returns true 
SELECT 'P 0' < 'P! ' COLLATE "en_GB"; -- returns false 
+1

LC_COLLATE = 'es_CL.UTF-8' in postgresql e LC_COLLATE = "es_MX.UTF-8" nella shell. –

3

Non si può mai presumere che le regole di confronto delle stringhe siano le stesse in due lingue o sistemi diversi. Ci sono una miriade di convenzioni; non è ben definito come è con i numeri. L'uguaglianza è la migliore, ma anche lì trovi le differenze (gli spazi finali vengono ignorati, il caso non importa, ecc.); l'ordinamento specifico di stringhe non uguali è al di fuori del regno del portatile.

Problemi correlati