[Ir al menú de PHP]
Empezando con bases de datos

Conexión con el servidor de bases de datos

Antes de empezar a trabajar con bases de datos debes cerciorarte de que tanto tu servidor Apache como tu WinMySQLAdmin están conectados.

La conexión con una base de datos remota tiene la siguiente sintaxis:

$c=mysql_connect (host, user, password)

donde $c es la variable que recoge el indentificador del enlace, host es la dirección del servidor de bases de datos, (en nuestra configuración local sería localhost) , user sería el nombre de uno de los usuarios registrados en la tabla user (recuerda lo que te he contado al respecto en la página anterior) y password la clave de acceso correspondiente al user.

Para cerrar la conexión, PHP dispone de la siguiente función:

$c=mysql_close ($c)

donde $c es el nombre de la variable en la que se recogió el indentificador del enlace en el momento de la apertura.

Aquí tienes el código de un script que realiza la apertura de una conexión y después la cierra.

Y aquí puedes comprobar el funcionamiento del script anterior.

Si realizáramos una segunda conexión (con los mismos argumentos) sin haber cerrado la anterior no se efectúa un nuevo enlace sino que nos devolverá el ya abierto.

Aquí tienes el código de un ejemplo y aquí puedes comprobarlo.

Crear una base de datos

La creación de una base de datos requiere tener previamente establecida una conexión con el servidor y utiliza la siguiente sintaxis:

mysql_create_db (nom)

donde nom es el nombre de la nueva base de datos.

Esta función devuelve TRUE si la base de datos es creada y FALSE si no es posible hacerlo.

Si intentamos crear una base de datos con un nombre ya existente la función nos devolverá FALSE.

Aquí tienes el código de un ejemplo de creación de una base de datos. Si lo ejecutas dos veces podrás comprobar que en la segunda oportunidad te aparece el mensaje diciendo que no ha sido posible crearla.

Borrar una base de datos

Para borrar una base de datos se requiere la siguiente función PHP:

mysql_drop_db (nombre, $c)

donde nombre es el nombre de la base de datos y $c el identificador de enlace aunque este último parámetro es opcional y solo tiene verdadero sentido sentido en el caso de que tengamos abiertas simultáneamente conexiones con dos servidores distintos.

Esta función devuelve TRUE cuando se ejecuta con éxito y FALSE en el caso contrario.

Este es el código de un script que borraría la base creada anteriormente.

Igual que ocurría al tratar de crearla, si intentamos borrar una base de datos inexistente la función mysql_drop_db nos devolverá FALSE.

Lista de bases de datos existentes

A la hora de crear y/o borrar bases de datos resulta conveniente y útil conocer su preexistencia.

PHP dispone de herramientas para conocer el número de bases de datos existentes en el servidor así como sus nombres.

Tales funciones son las siguientes: $p=mysql_list_dbs($c)

Esta función recoge en una variable $p un nuevo identificador que es imprescindible y previo al uso de las funciones que determinan los números y nombres de las bases de datos existentes en el enlace abierto identificado por $c.

$num=mysql_num_rows($p)

Esta función devuelve el número de bases de datos existentes en el servidor. Ese número puede recogerse en una variable (en este caso $num.

¡¡Cuidado...!!

Fíjate en la sintaxis. La función mysql_num_rows utiliza como parámetro $p que es el valor devuelto por la función mysql_list_dbs ejecutada previamente
.

mysql_db_name($p, n)

Esta nueva función devuelve el nombre de una de las bases de datos identificada por un número n que tiene que pertenecer al intervalo [0,$num).

Fíjate que n tiene que ser n<$num porque si por ejemplo $num=5 los cinco valores posibles de n serían: 0,1,2,3 y 4.

Una lista completa de todas las bases de datos existentes en el servidor podría hacerse de la siguiente forma:

Aquí tienes el código fuente de un ejemplo completo del proceso anterior.

Depurando los procesos de creación y borrado de bases de datos

Cuando intentábamos crear una base de datos ya existente o borrar una inexistente las funciones mysql_create_db y mysql_drop_db nos devolvían FALSE pero esa respuesta no nos dice la causa por la que no ha sido posible la ejecución de la instrucción.

Seguramente resulta muy interesante comprobar la existencia ó inexistencia de una base de datos antes de ejecutar esas instrucciones y que después de la comprobación se nos presentara un mensaje informativo.

Combinando las instrucciones anteriores no resulta díficil hacerlo. Aquí tienes un ejemplo de código para efectuar esa comprobación al crear una base de datos y este otro es para el caso de borrado.

Ver código fuente

Habrás observado que en algunos de los enlaces anteriores se puede visualizar el código fuente del script en vez de ejecutar el ejemplo.

Es evidente que la ejecución de los ejemplos daría error ya que han sido escritos para un localhost y tú estás visualizando estas páginas a través de mi amado freesurf que logica y razonablemente usa otro nombre de host y también otros nombres de user y de password.

Pese a que no funcionen, esos ejemplos están en el servidor de freesurf y tú puedes visualizarlos porque existe una función PHP que permite ver el código fuente de un script.

Esa función es:

show_source(fichero)

donde fichero es el nombre y la extensión del fichero a visualizar.

Tipos de campos MySQL

Antes de continuar con el manejo de tablas es necesario conocer los diferentes tipos de campos que soportan las tablas de MySQL. Aquí a la derecha los tienes... :)

A la hora de diseñar una tabla es muy importante hacer una cuidadosa elección de los tipos y tamaños de campos. Un tipo de campo bien elegido y un tamaño aducuado a las necesidades reales son las mejores garantías para optimizar el tamaño de la tabla y para hacerla verdaderamente eficaz.

El grado de eficiencia y funcionalidad de una tabla suele ser directamente proporcional al tiempo perdido en el análisis de la misma.

Despilfarra tu tiempo en esa fase previa... es una excelente inversión. Te lo aseguro...


 
 


Tipos del campos en MySQL


MySQL tiene habilitados diversos tipos de campos que en una primera aproximación podrían clasificarse en tres grupos:

Campos numéricos

MySQL soporta los tipos numéricos exactos(INTEGER, NUMERIC, DECIMAL, y SMALLINT) y los tipos numéricos aproximados (FLOAT, DOUBLE precision y REAL).

Los campos que contienen números enteros admiten el parámetro UNSIGNED que implica que no admita signos por lo que solo aceptaría enteros positivos.

Todos los campos númericos admiten el parámetro ZEROFILL cuya función es completar el campo con ceros a la izquierda hasta su longitud máxima.


Tipos de campos numéricos enteros

Estos son los distintos tipos de campos numéricos enteros que admite MySQL. Los parámetros señalados entre corchetes son opcionales.

TINYINT [(M)] [UNSIGNED] [ZEROFILL]  
 
Número entero muy pequeño. Con la opción UNSIGNED puede tomar valores entre 0 y 255. En caso contrario, puede estar comprendido entre -128 y 127.

Si el parámetro ZEROFILL solo tiene sentido junto con la opción UNSIGNED ya que no tiene ningún sentido tratar de rellenar con ceros a la izquierda de un número negativo.

El valor por defecto de parámetro M (número de cifras) es 4 sin no está activada la opción UNSIGNED. Si esta opción estuviera activada el valor por defecto sería M=3. Para valores de M >valor por defecto reajusta el tamaño al valor por defecto.

Si se asigna a M un valor menor que cuatro limita el número de carácteres al tamaño especificado considerando el signo solo en los números negativos.

Por ejemplo, si M=3 admitiría 148 pero si intentamos insertar -148 recortaría por la izquierda y solo insertaría -14.

Si intentamos insertar un valor fuera de rango registraría el valor dentro del rango más próximo a él.
P. ej.: Si tratamos de insertar el valor 437 escribiría 127 ó 255, este último en el caso de tener la opción UNSIGNED.
Si pretendiéramos insertar -837 con la opción UNSIGNED escribiría 0 y sin ella pondría -128.

El tamaño de un campo TINYINT es de 1 byte.
 
SMALLINT [(M)] [UNSIGNED] [ZEROFILL]  
 
Número entero pequeño. Con la opción UNSIGNED puede tomar valores entre 0 y 65 535. En caso contrario, puede estar comprendido entre -32 768 y 32 767.

Son válidos los comentarios hechos para TINYINT excepto los relativos a los valores por defecto de M que en este caso serían 6 ó 5. Su tamaño es de 2 bytes.
 
MEDIUMINT [(M)] [UNSIGNED] [ZEROFILL]  
 
Número entero mediano. Con la opción UNSIGNED puede tomar valores entre 0 y 16 777 215. En caso contrario, puede estar comprendido entre -8 388 608 y 8 388 607.

También son válidos los comentarios hechos para TINYINT excepto los relativos al valor por defecto de M que en este caso serían 8. Su tamaño es de 3 bytes.
 
INT [(M)] [UNSIGNED] [ZEROFILL]  
 
Número entero. Con la opción UNSIGNED puede tomar valores entre 0 y 4 294 967 295. En caso contrario, puede estar comprendido entre -2 147 483 648 y 2 147 483 647.

Son válidos todos los comentarios de los casos anteriores. Su tamaño es de 4 bytes.
 
INTEGER [(M)] [UNSIGNED] [ZEROFILL]  
 
Es un sinónimo de INT
 
BIGINT [(M)] [UNSIGNED] [ZEROFILL]  
 
Número entero grandes. Con la opción UNSIGNED puede tomar valores entre 0 y 18 446 744 073 709 551 615. En caso contrario, puede estar comprendido entre -9 223 372 036 854 775 808 y 21 474 839 223 372 036 854 775 807 647, pero al usarlo desde PHP estará sujeto a las limitaciones máximas de los valores numéricos de este.

Son válidos todos los comentarios de los casos anteriores. Su tamaño es de 8 bytes.

Números de coma flotante

Por la estructura binaria de los microprocesadores y habida cuenta de que algunos números no enteros -sin ir más lejos, el 0.1- requerirían infinitos caracteres binarios para su representación exacta, se hace necesario introducir un redondeo en su tratamiento informático y como consecuencia de ello asumir que se generan errores de medida.

Esta circunstancia obligó al tratamiento de los número decimales mediante el llamado Standar de Aritmética de Punto Flotante, un algoritmo definido por la IEEE (Institute of Electrical and Electronics Engineers que unificó los procesos de representación de números en ordenadores con lo que son uniformemente controlables los errores introducidos.

El Standar de Aritmética de Punto Flotante estableció dos niveles de precisión: MySQL admite los siguientes tipos de números de coma flotante:

 
FLOAT(x) [ZEROFILL]  
 
Número de coma flotante. Ignora la opción UNSIGNED pero si acepta ZEROFILL por lo que debe prestarse atención a estas opciones ya que no sería demasiado habitual una presentación como esta: 000-3.47

El valor de x especifica la precisión. Si x<=24 será de precisión simple. cuando 24 <x <=53 lo convertirá automáticamente a doble precisión.

Cuando no se especifica el valor de x considera el campo como de precisión simple. Su tamaño es de 4 bytes si x<=24 y de 8 bytes cuando 24 <x <=53
 
FLOAT [(M,D)] [ZEROFILL]  
 
Número de coma flotante de precisión simple. Son válidos los comentarios relativos a las opciones UNSIGNED y ZEROFILL del caso anterior.

Toma valores en los interavalos siguientes:
  • -3.402823466E+38 a -1.175494351E-38
  • 0 y
  • 1.175494351E-38 a 3.402823466E+38.
M es la anchura máxima de visualización y D es el número dedecimales. Si M > 24 se convierte automaticamente a doble precisión
FLOAT sin argumentos, representa un número de coma flotante y precisión simple.
 
DOUBLE [(M,D)] [ZEROFILL]  
 
Número de coma flotante de doble precisión. Siguen siendo válidos los comentarios relativos a las opciones UNSIGNED y ZEROFILL del caso anterior.

Toma valores en los interavalos siguientes:
  • -1.7976931348623157E+308 a -2.2250738585072014E-308
  • 0 y
  • 2.2250738585072014E-308 a 1.7976931348623157E+308
M es la anchura máxima de visualización y D es el número dedecimales.

FLOAT sin argumentos, representa un número de coma flotante y precisión doble.
 
REAL [(M,D)] [ZEROFILL]  
 
Es sinónimo de DOUBLE.
 
DECIMAL [(M[,D])] [ZEROFILL]  
 
Es un número de coma flotante y doble precisión que se almacena como un campo de tipo CHAR.

El valor es guardado como una cadena donde cada carácter representa una cifra. La coma y el signo menos de los números negativos no son tenidos en cuenta en el valor de M -anchura máxima de visualización- aunque si se reserva -automaticamente- espacio para ellos en campo.
Si D vale 0 no tendrá parte decimal. Los números toman valores en el mismo intervalo especificado para DOUBLE.

Los valores por defecto de M y D son respectivamente 10 y 0.
Ocupan M+2 bytes si D > 0; M+1 bytes si D = 0 ó D+2 bytes si M < D
 
NUMERIC(M,D) [ZEROFILL]  
 
Se comporta de forma idéntica a DECIMAL

Campos de fecha

MySQL dispone de campos específicos para el almacenamiento de fechas. Son los siguientes:

DATE  
 
Recoge una fecha dentro del intervalo 01-01-1000 a 31-12-9999. MySQL guarda los valores DATE con formato AAAA-MM-DD (año-mes-dia) . Su tamaño es de 3 bytes.
 
DATETIME  
 
Recoge una combinación de fecha y hora dentro del intervalo 00:00:00 del día 01-01-1000 y las23:59:59 del día 31-12-9999. MySQL guarda los valores DATETIME con formato AAAA-MM-DD HH:MM:SS (año-mes-dia hora:minutos:segundos) . Su tamaño es de 8 bytes.
 
TIME  
 
Recoge una hora dentro del intervalo -838:59:59 a 838:59:59. MySQL guarda los valores TIME con formato HH:MM:SS (horas:minutos:segundos) . Su tamaño es de 3 bytes.
 
YEAR ó YEAR(2) ó YEAR(4)  
 
Recoge un año en formato de cuatro cifras (YEAR ó YEAR(4)) o en formato de dos cifras (YEAR(2))dentro del intervalo 1901 a 2155 en el caso de cuatro cifras ó de 1970 a 2069 si se trata de dos cifras. Su tamaño es de 1 byte.
 
TIMESTAMP [(M)]  
 
Recoge un tiempo UNIX. El intervalo válido va desde 01-01-1970 00:00:00 a cualquier fecha del año 2037.

El parámetro M puede tomar los valores: 14 (valor por defecto), 12, 8, o 6 que se corresponden con los formatos AAAAMMDDHHMMSS, AAMMDDHHMMSS, AAAAMMDD, ou AAMMDD.
Si se le asigna la opción NUL guardará la hora actual. Cuando se asigna 8 ó 14 como parámetros es considerado como un número y para las demás opciones como una cadena.

Independientemente del valor del parámetro, un campo TIMESTAMP siempre ocupa 4 bytes.
 


Campos tipo cadena de caracteres

CHAR (M) [BINARY]  
 
Es una cadena de tamaño fijo que se completa a la derecha por espacios si es necesario.

El parámetro M puede valer de 1 a 255 caracteres.

Los espacios finales son suprimidos cuando la cadena es insertada en el registro.

Los valores de tipo CHAR son elegidos y comparados sin tener en cuenta Mayúsculas / Minúsculas y utilizan el juego de carácteres por defecto.

Se puede utilizar el operador BINARY para hacer la cadena sensible a Mayúsculas / Minúsculas.

Se puede utilizar un campo tipo CHAR(0) con el atributo NULL para almacenar una valor booleano. En este caso ocupará un solo byte y podrá tener únicamente dos valores: NUL ó "".

Su tamaño es de M bytes siendo 1 <= M <= 255 .
 
VARCHAR(M) [BINARY]  
 
Es una cadena de caracteres de longitud variable. Su tamaño máximo -especificado en el parámetro M- puede estar comprendido entre 1 y 255 caracteres. Con la opción BINARY es capaz de discriminar entre Mayúsculas / minúsculas.
 
TINYBLOB o TINYTEXT  
 
TINYBLOB y TINYTEXT son cadenas de caracteres de longitud variable con un tamaño máximo de 255 (28 - 1) caracteres.

La diferencia entre ambas es que TINYBLOB si discrimina entre Mayúsculas / minúsculas, mientras que TINYTEXT no lo hace.

Ninguno de los campos: BLOB y TEXT admite valores por DEFECTO

Las versiones de MySQL anteriores a 3.23.2 permiten utilizar estos campos para indexar.

Si se intenta guardar en un campo de este tipo una cadena de mayor longitud que la especificada solamente se guardarán los M primeros caracteres de la cadena.
 
BLOB o TEXT  
 
BLOB y TEXT son cadenas de caracteres de longitud variable con un tamaño máximo de 65535 (216 - 1) caracteres.

La diferencia entre ambas es que BLOB si discrimina entre Mayúsculas / minúsculas, mientras que TEXT no lo hace.

Ninguno de los campos: BLOB y TEXT admite valores por DEFECTO

 
MEDIUMBLOB o MEDIUMTEXT  
 
MEDIUMBLOB y MEDIUMTEXT son cadenas de caracteres de longitud variable con un longitud máxima de 16.777.215 (224 - 1) caracteres.
Son válidas las especificaciones hechas en el apartado anterior.

El tamaño máximo de los campos de este tipo está sujeto a limitaciones externas tales como la memoria disponible y el tamaño del buffer de comunicación servidor/cliente.

 
LONGBLOB o LONGTEXT  
 
Su única diferencia con la anterior es el tamaño máximo de la cadena que en este caso es 4.294.967.295 (232 - 1) caracteres.
 
ENUM('valor1','valor2',...)  
 
Es una cadena de caracteres que contiene uno solo de los valores de la lista (valor1, valor2, etc. etc.).

A la hora de insertar un nuevo registro en una tabla, el valor a especificar para un campo de este tipo ha de ser una cadena que contenga uno de los valores especificados en la tabla. Si se tratara de insertar un valor distinto de ellos insertaría una cadena vacía.
 
SET('valor1','valor2','valor3'...)  
 
Es una cadena de caracteres formados por la unión de ninguno, uno varios de los valores de una lista. El máximo de elementos es 64.

Los valores que deben escribirse en los registros de la tabla que contiene este campo serían de este tipo han de ser númericos expresados en forma binaria o en forma decimal.

En el supuesto de que contuviera tres valores los posibles valores a insertar en un campo de este tipo a la hora de añadir un registro serían los siguientes.

Incluir valores Código valor Cadena
binaria
Equiv.
decimal
val1 val2 val3 val1 val2 val3
Si 1 1 1 111 7
Si No 1 1 0 011 3
Si No 1 0 1 101 5
No 0 1 1 110 6
No No 0 0 1 100 4
No NO 0 1 0 010 2
Si No No 1 0 0 001 1
No No No 0 0 0 000 0
 

Sugerir a un/a amig@ Envíame tus comentarios
Anterior
Indice
Siguiente