una - que significa not null en mysql
¿Por qué una columna de texto no puede tener un valor predeterminado en MySQL? (8)
Si intentas crear una columna TEXT en una tabla y darle un valor predeterminado en MySQL, obtienes un error (al menos en Windows). No veo ninguna razón por la cual una columna de texto no debe tener un valor predeterminado. Ninguna explicación es dada por la documentación de MySQL. Me parece ilógico (¡y algo frustrante, ya que quiero un valor predeterminado!). ¿Alguien sabe por qué esto no está permitido?
"Soporte para DEFAULT en columnas TEXT / BLOB" es una solicitud de función en MySQL Bugtracker (Error # 21532) .
Veo que no soy el único a quien le gustaría poner un valor predeterminado en una columna de TEXTO. Creo que esta característica debería ser compatible en una versión posterior de MySQL.
Esto no se puede arreglar en la versión 5.0 de MySQL, porque aparentemente causaría incompatibilidad y daños si alguien intentara transferir una base de datos entre las bases de datos (actuales) que no son compatibles con esa característica y con cualquier base de datos que sí lo admitiera. esa característica.
¿Qué estás haciendo exactamente? Una prueba rápida aquí mostró que una columna de texto puede muy felizmente tener un valor predeterminado:
mysql> create table test (a char(32) not null default ''this works'', b char(32) not null);
Query OK, 0 rows affected (0.03 sec)
mysql> insert into test (b) values(''hello'');
Query OK, 1 row affected (0.01 sec)
mysql> select * from test;
+------------+-------+
| a | b |
+------------+-------+
| this works | hello |
+------------+-------+
1 row in set (0.00 sec)
Como la pregunta principal:
¿Alguien sabe por qué esto no está permitido?
todavía no se responde, hice una búsqueda rápida y encontré una adición relativamente nueva de un desarrollador de MySQL en MySQL Bugs :
[17 de marzo de 2017 a las 15:11] Ståle Deraas
Publicado por el desarrollador:
Esta es de hecho una solicitud de función válida, y a primera vista puede parecer trivial de agregar. Pero los valores TEXT / BLOBS no se almacenan directamente en el búfer de registro utilizado para leer / actualizar tablas. Por lo tanto, es un poco más complejo asignarles valores predeterminados.
Esta no es una respuesta definitiva, pero al menos es un punto de partida para la pregunta por qué .
Mientras tanto, voy a codificarlo y hacer que la columna sea nulable o asignar explícitamente un valor ( ''''
) predeterminado para cada insert
desde el código de la aplicación ...
Normalmente ejecuto sitios en Linux, pero también desarrollo en una máquina local de Windows. Me he encontrado con este problema muchas veces y simplemente arreglé las tablas cuando encontré los problemas. Instalé una aplicación ayer para ayudar a alguien y, por supuesto, volví a encontrarme con el problema. Entonces, decidí que era hora de descubrir qué estaba pasando y encontré este hilo. Realmente no me gusta la idea de cambiar el modo sql_mode del servidor a un modo anterior (por defecto), así que se me ocurrió una solución simple (me parece).
Esta solución, por supuesto, requeriría que los desarrolladores envuelvan sus scripts de creación de tablas para compensar el problema de MySQL que se ejecuta en Windows. Verá conceptos similares en los archivos de volcado. Una GRAN advertencia es que esto podría causar problemas si se usa la partición.
// Store the current sql_mode
mysql_query("set @orig_mode = @@global.sql_mode");
// Set sql_mode to one that won''t trigger errors...
mysql_query(''set @@global.sql_mode = "MYSQL40"'');
/**
* Do table creations here...
*/
// Change it back to original sql_mode
mysql_query(''set @@global.sql_mode = @orig_mode'');
Eso es todo.
Para Ubuntu 16.04:
Cómo deshabilitar el modo estricto en MySQL 5.7:
Edite el archivo /etc/mysql/mysql.conf.d/mysqld.cnf
Si existe una línea inferior en mysql.cnf
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Luego reemplázalo con
sql_mode=''MYSQL40''
De otra manera
Solo agrega la línea de abajo en mysqld.cnf
sql_mode=''MYSQL40''
Este problema resuelto.
Puede obtener el mismo efecto que un valor predeterminado mediante el uso de un disparador
create table my_text
(
abc text
);
delimiter //
create trigger mytext_trigger before insert on my_text
for each row
begin
if (NEW.abc is null ) then
set NEW.abc = ''default text'';
end if;
end
//
delimiter ;
Sin un conocimiento profundo del motor mySQL, diría que esto suena como una estrategia de ahorro de memoria. Supongo que la razón está detrás de este párrafo de los docs :
Cada valor BLOB o TEXT se representa internamente por un objeto asignado por separado. Esto está en contraste con todos los otros tipos de datos, para los cuales el almacenamiento se asigna una vez por columna cuando se abre la tabla.
Parece que el llenado previo de estos tipos de columna generaría el uso de memoria y penalizaciones de rendimiento.
Windows MySQL v5 arroja un error, pero Linux y otras versiones solo generan una advertencia. Esto necesita ser arreglado. WTF?
También vea un intento de arreglar esto como el bug # 19498 en MySQL Bugtracker:
Bryce Nesbitt el 4 de abril de 2008 4:36 pm:
En MS Windows, la regla "no DEFAULT" es un error, mientras que en otras plataformas a menudo es una advertencia. Aunque no es un error, es posible quedar atrapado por esto si escribe código en una plataforma flexible y luego lo ejecuta en una plataforma estricta:
Personalmente, veo esto como un error. La búsqueda de "columna BLOB / TEXT no puede tener un valor predeterminado" arroja unos 2.940 resultados en Google. La mayoría de ellos son informes de incompatibilidades al intentar instalar scripts DB que funcionaron en un sistema pero no en otros.
Me encuentro con el mismo problema ahora en una aplicación web que estoy modificando para uno de mis clientes, originalmente implementada en Linux MySQL v5.0.83-log. Estoy ejecutando Windows MySQL v5.1.41. Incluso tratando de usar la última versión de phpMyAdmin para extraer la base de datos, no informa un valor predeterminado para la columna de texto en cuestión. Sin embargo, cuando intento ejecutar una inserción en Windows (que funciona bien en la implementación de Linux) recibo un error de no configuración predeterminada en la columna ABC. Intento recrear la tabla localmente con el valor predeterminado obvio (basado en una selección de valores únicos para esa columna) y al final recibir la columna de BLOB / TEXTO tan útil que no puede tener un valor predeterminado .
De nuevo, no mantener la compatibilidad básica entre plataformas es inaceptable y es un error.
Cómo deshabilitar el modo estricto en MySQL 5 (Windows):
Edite /my.ini y busque la línea
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Reemplácelo con
sql_mode=''MYSQL40''
Reinicie el servicio MySQL (suponiendo que sea mysql5)
net stop mysql5 net start mysql5
Si tiene acceso de administrador / raíz, es posible que pueda ejecutar
mysql_query("SET @@global.sql_mode=''MYSQL40''");