web-dev-qa-db-fra.com

Comment le changement du type de champ mysql de INT à VARCHAR affectera les données précédemment stockées en tant qu'INT

J'ai besoin de mettre à jour un champ dans ma base de données de production d'INT vers VARCHAR.

Les informations dans le champ INT actuel sont sensibles et je veux m'assurer de ne pas les modifier par inadvertance ni de les détruire lors du changement de type de table. Par exemple, un utilisateur peut avoir INT 123456 stocké dans cette colonne et je veux m'assurer qu'il est stocké avec précision une fois converti en VARCHAR.

Quel est le processus recommandé pour y parvenir?

Y a-t-il quelque chose dont je dois m'inquiéter lorsque j'utilise quelque chose comme ça?

ALTER TABLE table_sample CHANGE col_sample col_sample VARCHAR;

Merci d'avance pour votre aide.

47
john k

Mettez votre serveur MySQL en mode strict avant de changer le type de colonne et assurez-vous que votre colonne varchar(n) a un n suffisamment grand pour contenir tous les entiers lorsqu'ils sont convertis en chaînes. Si vous n'êtes pas en mode strict, MySQL --- tronquera silencieusement vos données pour qu'elles correspondent à la taille de votre chaîne :

Si le mode SQL strict n'est pas activé et que vous affectez une valeur à une colonne CHAR ou VARCHAR qui dépasse la longueur maximale de la colonne, la valeur est tronquée pour s'adapter et un avertissement est généré. Pour la troncature des caractères non spatiaux, vous pouvez provoquer une erreur (plutôt qu'un avertissement) et supprimer l'insertion de la valeur en utilisant le mode SQL strict.

Mais si vous entrez mode strict d'abord:

mysql> set sql_mode = 'STRICT_ALL_TABLES';
mysql> alter table table_sample change col_sample col_sample varchar(6);

Vous obtiendrez un joli message d'erreur comme celui-ci:

ERROR 1406 (22001): Data too long for column 'col_sample' at row ...

si vos entiers ne rentrent pas tous dans votre varchar.

Et, bien sûr, vous aurez une nouvelle sauvegarde vérifiée de votre base de données avant d'essayer de modifier la table. Et par vérifié je veux dire que vous avez réussi à restaurer votre sauvegarde dans une base de données de test.

53
mu is too short