Me gustaría proteger el campo de email de la siguiente tabla:
CREATE TABLE users ( email VARCHAR(255) NULL CHECK (email ~* '\A[^@]+@[^@]+\Z') );Lo que me gustaría hacer es permitir cadenas como:
bob@ejemplo
Pero me gustaría evitar cadenas como:
bob@ejemplo\nfuu
Escuché que la restricción \Z permite cualquier carácter después de otra línea (con \n ).
De acuerdo con las mejores prácticas en expresiones regulares, \z es mejor que \Z ya que solo permite una línea, pero parece que PostgreSQL no lo admite . Y el $ no es mejor.
¿Soy cierto?
Editar:
Probé esto:
CREATE TABLE users ( email VARCHAR(255) NULL CHECK (email ~* '\A[^@\n]+@[^@\n]+\Z') ); CREATE UNIQUE INDEX users__lower_case__email ON users(lower(email)); -- INSERT INTO users (email) VALUES ('\nfoo\n@\nbar\n');Aparentemente, la restricción no funcionó: se agregó el correo electrónico incorrecto en la tabla.
Tenga en cuenta que las clases de caracteres negados coinciden con cualquier carácter excepto los definidos en el conjunto. Entonces, [^@] coincide con cualquier carácter excepto @ , incluidos los símbolos de nueva línea . Para excluir una nueva línea, simplemente agréguela a la clase.
Usar
email ~* '\A[^@\n]+@[^@\n]+\Z' Como \Z solo coincide solo al final de la cadena , no hay forma de que esta expresión regular pueda permitir una nueva línea en la entrada.
Le sugiero que revise mi publicación para conocer la forma correcta de almacenar una dirección de correo electrónico en PostgreSQL.
Aquí hay un código de ejemplo,
CREATE EXTENSION citext; CREATE DOMAIN email AS citext CHECK ( value ~ '^[a-zA-Z0-9.!#$%&''*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$' ); SELECT 'asdf@foobar.com'::email;para tu mesa,
CREATE TABLE users ( user_email email );