Environnement de test

  • java 1.6.0_14
    • mysql-connector-5.0.8-bin.jar
  • mysql 5.0.32

mysql-connector-5.0.8-bin.jar

Le connecteur mysql 5.0.8 configure sa connexion tel que ci dessous avant toute requête exécutée. Notez l'importance du sql_mode='STRICT_TRANS_TABLES'

                891653 Query       SHOW SESSION VARIABLES
                891653 Query       SHOW COLLATION
                891653 Query       SET character_set_results = NULL
                891653 Query       SET autocommit=1
                891653 Query       SET sql_mode='STRICT_TRANS_TABLES'
                891653 Query       SHOW CREATE TABLE testDefaultValue
                891653 Query       DESCRIBE testDefaultValue

Les tests

Aucune valeur valeur par défaut de définie

INSERT 1

CREATE TABLE `testDefaultValue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `typeVarChar` varchar(50) NOT NULL,
  `typeText` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeVarChar) VALUES ('myString');

Erreur SQL : Field 'typeText' doesn't have a default value

INSERT 2

CREATE TABLE `testDefaultValue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `typeVarChar` varchar(50) NOT NULL,
  `typeText` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeText) VALUES ('myString');

Erreur SQL : Field 'typeVarChar' doesn't have a default value

Valeur définie à '' pour typeVarChar

INSERT 1

CREATE TABLE `testDefaultValue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `typeVarChar` varchar(50) NOT NULL DEFAULT '',
  `typeText` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeVarChar) VALUES ('myString');

Erreur SQL : Field 'typeText' doesn't have a default value

INSERT 2

CREATE TABLE `testDefaultValue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `typeVarChar` varchar(50) NOT NULL DEFAULT '',
  `typeText` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeText) VALUES ('myString');

Nombre d'enregistrement modifiés : 1

Valeur NULL possible pour typeText

Le BLOB/TEXT ne permettant d'avoir de valeur par défaut, on le passe à "peut être NULL" qui à implicitement comme valeur par défaut NULL

ALTER TABLE testDefaultValue
ALTER COLUMN typeText SET DEFAULT 'defaultValueText'  ;
-- BLOB/TEXT column 'typeText' can't have a default value
 
ALTER TABLE `testDefaultValue` CHANGE `typeText` `typeText` TEXT NULL ;

INSERT 1

CREATE TABLE `testDefaultValue` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `typeVarChar` varchar(50) NOT NULL,
  `typeText` text,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeVarChar) VALUES ('myString');

Nombre d'enregistrement modifiés : 1

Conclusion sur les valeurs par défaut des champs des tables des bases de données

Que faire ?

Faut il définir les valeurs par défaut ? à vide '', ou bien tout rendre NULL y compris les valeurs par défaut ?

En tout cas avec MySQL, si l'on veut définir des valeurs par défaut pour des champs de type TEXT ou BLOB, vous n'aurez pas d'autres chois que de le rendre NULL.

Quel impact d'avoir ses champs NULL ?

La valeur NULL signifie "pas de données" et est différente des valeurs comme 0 pour les nombres ou la chaîne vide pour les types chaîne. Voyez les problèmes avec les valeurs NULL.

Si vous voulez trouver les colonnes dont la valeur est NULL, vous ne pouvez pas utiliser le test =NULL. Pour trouver les valeurs NULL, vous devez utiliser le test IS NULL.

Le fait de définir ses champs avec comme valeur possible à NULL, vous impose d'enregistrer, lire et comparer cette valeur dans le code de vos applications. Écrire vos requêtes SQL avec la gestion du NULL et IS NULL est plus complexe qu'un simple '$value', mais heureusement, pour cela ils existe de bons API et de bons ORM.

Lors de l'utilisation de GROUP BY, toutes les valeurs NULL sont considérées comme égales.

Les fonctions agrégeantes comme COUNT(), MIN() et SUM() ignorent les valeurs NULL.

Comment faire la différence entre un champs sans valeur par défaut et une valeur par défaut vide '' ?

Si vous savez, je vous invite à nous le dire :) !

Ressources

MySQL

  • MODIFY et ALTER TABLE Syntax : alter-table alter-table
  • DESCRIBE Syntax (obtenir des informations sur les colonnes) : describe
  • SHOW COLUMNS Syntax : show-columns show-columns
  • SHOW CREATE TABLE Syntax : show-create-table show-create-table
  • Data Type Default Values : data-type-defaults :
    • If the column cannot take NULL as the value, MySQL defines the column with no explicit DEFAULT clause. For data entry, if an INSERT or REPLACE statement includes no value for the column, or an UPDATE statement sets the column to NULL, MySQL handles the column according to the SQL mode in effect at the time:
      • If strict SQL mode is not enabled, MySQL sets the column to the implicit default value for the column data type.
      • If strict mode is enabled, an error occurs for transactional tables and the statement is rolled back. For nontransactional tables, an error occurs, but if this happens for the second or subsequent row of a multiple-row statement, the preceding rows will have been inserted.
  • Le mode SQL du serveur : server-sql-mode server-sql-mode
  • Valeurs NULL : null-values null-values

Autres