2010-08-03 15 views
24

Tengo una tabla en mi base de datos Mysql, que se utiliza para la autenticación. Y ahora, necesito hacer que la autenticación sea sensible a mayúsculas y minúsculas. Haciendo búsquedas en Google, me he dado cuenta de que las columnas Mysql no distinguen entre mayúsculas y minúsculas (a diferencia de Oracle) de las operaciones de búsqueda y el comportamiento predeterminado se puede cambiar al crear la tabla especificando el "binario", es decir.Alteración de la columna de la tabla Mysql para distinguir entre mayúsculas y minúsculas

CREATE TABLE USERS 
(
    USER_ID SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
    USER_NAME VARCHAR(50) BINARY NOT NULL 
) 

Puede alguien por favor dígame cómo modificar la tabla en MySQL para añadir el "binario" a una columna existente de una base de datos?

Gracias!

+0

No es necesario que sea binario para que distinga entre mayúsculas y minúsculas. Si es un varchar, simplemente use collation = latin1_general_cs – Chiwda

Respuesta

27
ALTER TABLE USERS CHANGE USER_NAME USER_NAME VARCHAR(50) BINARY NOT NULL; 
+2

No es necesario que liste el nombre de la columna dos veces si no se cambia;) – defines

+14

Para citar la documentación de mysql http://dev.mysql.com/doc/refman/5.1/en/alter-table.html, " Si desea cambiar el tipo de una columna pero no el nombre, la sintaxis CHANGE aún requiere un nombre de columna nuevo y antiguo, incluso si son iguales ". – deinst

+0

En caso de que alguien haya perdido los documentos, puede usar 'MODIFY' en lugar de' CHANGE' si no está cambiando el nombre de la columna.En ese caso, solo necesita proporcionar el nombre de la columna una vez. – wsams

-1

En lugar de alterar su mesa, todavía se pueden realizar consultas entre mayúsculas y minúsculas en su mesa al realizar la autenticación, utilice la opción binaria de la siguiente manera:

SELECT BINARY * FROM USERS where USER_ID = 2 AND USER_NAME = 'someone' LIMIT 1; 

¿Esto ayuda?

+0

Basado en lo anterior, un nombre de usuario de SomeOne devolverá falso. – SimonDowdles

+4

Esto agrega una sobrecarga significativa a cada consulta. Si los datos siempre se deben devolver binarios, ¿por qué convertirlos en cada acceso? Eso es lo que llamamos "kludge". – defines

+0

Tal vez no entiendo, ¿la siguiente declaración significará un caso de verificación SENSITIVA en el futuro? ALTER TABLE USERS CHANGE USER_NAME USER_NAME VARCHAR (50) BINARY NOT NULL; Por lo que yo entendía, cada autenticación de inicio de sesión debe ser sensible a mayúsculas y minúsculas. – SimonDowdles

4

Usted debe ser capaz de hacer algo como esto:

Editar: leído mal lo que pretende hacer:

ALTER TABLE USERS MODIFY 
    USER_NAME VARCHAR(50) 
     CHARACTER SET latin1 
     COLLATE latin1_bin; 
+0

Me funcionó a continuación: ALTER TABLE UserAccounts CAMBIAR Contraseña Contraseña varchar (50) NOT NULL COLLAR utf8_bin; –

6

Por favor, vea http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

Ejemplo:

ALTER TABLE some_table MODIFY some_column BLOB; 
ALTER TABLE some_table MODIFY some_column VARCHAR(50) BINARY; 

La primera línea se convierte en un tipo de datos binarios (intento de minimizar la pérdida de caracteres) y la segunda convierte de nuevo al tipo VARCHAR con colación BINARY.

Puede ser realmente preferible almacenar como uno de los tipos binarios (BLOB, BINARY, o VARBINARY) en lugar de simplemente cotejar BINARY. Le sugiero que compare un poco, su kilometraje puede variar según sus datos reales y las consultas que necesita para ejecutar.

Cuestiones relacionadas