Averiguar el número de tablas de una base de datos
La consulta es sencilla:
select count(*) from information_schema.tables where table_schema = ‘nombredelabasededatos‘;
Dentro de cada servidor de base de datos de MySQL/MariaDB tendremos una base de datos llamada «information_schema«. Dentro de la misma, una tabla llamada tables. Es en esta en la que encontraremos el catálogo de todas las tablas del servidor.
En un hosting que utilizo para mis pruebas he utilizado esta consulta y funciona, por lo que imagino que tengo privilegios (de lectura) de la tabla. (Me planteo si podré consultar las tablas del resto de usuarios, por ahora me voy a quedar con la duda).
Esta tabla tiene los siguientes campos:
TABLE_CATALOG varchar(512) No
TABLE_SCHEMA varchar(64) No
TABLE_NAME varchar(64) No
TABLE_TYPE varchar(64) No
ENGINE varchar(64) Sí NULL
VERSION bigint(21) UNSIGNED Sí NULL
ROW_FORMAT varchar(10) Sí NULL
TABLE_ROWS bigint(21) UNSIGNED Sí NULL
AVG_ROW_LENGTH bigint(21) UNSIGNED Sí NULL
DATA_LENGTH bigint(21) UNSIGNED Sí NULL
MAX_DATA_LENGTH bigint(21) UNSIGNED Sí NULL
INDEX_LENGTH bigint(21) UNSIGNED Sí NULL
DATA_FREE bigint(21) UNSIGNED Sí NULL
AUTO_INCREMENT bigint(21) UNSIGNED Sí NULL
CREATE_TIME datetime Sí NULL
UPDATE_TIME datetime Sí NULL
CHECK_TIME datetime Sí NULL
TABLE_COLLATION varchar(32) Sí NULL
CHECKSUM bigint(21) UNSIGNED Sí NULL
CREATE_OPTIONS varchar(2048) Sí NULL
TABLE_COMMENT varchar(2048) No
.
Exportar/Importar tablas de MySQL/MariaDB desde consola
Si quiero exportar una base de datos para luego importarla en otro servidor desde un terminal:
mysqldump –u usuario -p nombre_basededatos > fichero_exportación.sql
Nos pedirá la contraseña y nos genera el fichero en el directorio que especifiquemos o en la carpeta actual.
Si ese fichero quiero importarlo, podré hacerlo con la opción de Importar de phpMyAdmin o desde consola con el siguiente comando:
mysql –u usuario -p nombre_basededatos < fichero_importación.sql
En el formato en el que importamos/exportamos tendremos nuestro DROP TABLE seguido de CREATE TABLE, por lo que podemos olvidarnos de tener que crear las tablas por nuestra cuenta.
Si lo que queremos es exportar una tabla concreta de una bse de datos:
mysqldump –u usuario -p nombre_basededatos nombre_tabla > fichero_exportación.sql
Importar un DBF a MySQL
Voy a utilizar phpMyAdmin.
En primer lugar hay que pasar el DBF a CSV, sí, es obligatorio (al menos con phpMyAdmin).
- Lo mejor es abrirse un Excel y desde ahí abrir el DBF. Te preguntará qué idioma tiene tu fichero, seleccionando internacional te funcionará.
- Ya tengo en Excel abierto el DBF. Ahora, me aseguro de que en la primera fila estén escritos los nombres de los campor por cada una de las columnas.
- Guardo el fichero DBF en formato CSV utilizando el Guardar como de Excel.
- ¿Todo hecho? No, ahora me debo abrir el fichero CSV con el Bloc de Notas o con un editor de texto (véase el GEdit).
- Ya tengo el fichero abierto. Debo asegurarme de lo siguiente para que la carga en phpMyAdmin sea correcta:
- Los campos de texto deben estar encerrados entre comillas dobles «
- Los campos deben estar separados por ;
- Los números con decimales deben utilizar el .
- Guardo el fichero y me paso a phpMyAdmin.
- Selecciono la base de datos donde quiero crear la tabla con mis datos.
- Pulso la pestaña Importar
- Selecciono el botón Examinar para seleccionar el fichero que quiero cargar
- Una vez selecccionado, phpMyAdmin detecta que es un CSV y nos va a preguntar ciertas cosas. Únicamente debemos tener en cuenta que nuestro separador de texto son las comillas dobles «, y que nuestro separador de columnas es el ;
- Recuerda seleccionar el checkbox sobre que la primera fila contiene los nombres de los ficheros
- Pulsamos importar y ya estará todo hecho
Seguro??
Hay veces que con lo anterior la importación la hace «regulera». Esto se debe a que supone la definición de los campos, es decir, si va entre comillas dobles será un VARCHAR, si lleva decimales será un DECIMAL y por defecto te pondrá 4,2 por ejemplo. ¿Esto qué quiere decir? Que si tienes más de 3 decimales te va a truncar.
Solución
Define la tabla tú mismo. Asegúrate de que los campos los pones en el mismo orden y con el tipo correcto.
Una vez hecho esto. Modifica el fichero CSV para que en la primera fila no aparezcan los nombres de los campos, es decir, que sean datos directamente.
En phpMyAdmin pulsas sobre la tablas que acabas de crear y una vez mostrado que está vacía, pulsa Importar. Haces el mismo procedimiento de antes y lo que te hará será un INSERT por cada fila de tu CSV.
Mostrar mis bases de datos y tablas en MySQL. Clonar una tabla
Desde la consola de MySQL, para obtener los nombres de las bases de datos que tengo en el servidor al que estoy conectado utilizaré la orden:
show databases;
Si, una vez conectado a una base de datos, quiero saber los nombres de las distintas tablas que contiene esa base de datos utilizaré:
show tables;
Si quiero conocer la estrutura de una tabla en concreto utilizaré:
desc mitabla;
Y un consejo, una vez que vayamos a hacer algún ALTER a una tabla o a borrarle elementos, si esta tabla es de vital importancia, será mejor hacernos una copia de seguridad. Una opción es clonar la tabla. Para hacerlo la mejor opción es utilizar las dos siguientes órdenes:
create table clon_mitabla like mitabla;
insert into clon_mitabla select * from mitabla;
Con la primera copio la estructura y con la segunda copio los datos.
Generar bases de datos de prueba
Voy a empezar a trabajar en un nuevo proyecto personal, tiene que ver con Google Charts y con la API de Google Maps, así que pronto iré profundizando en el tema e iré subiendo nuevos posts.
Para empezar, necesito una base de datos con la que probar. Como siempre, he ido a buscar por ahí bases de datos de prueba y me he encontrado con la página:
Está en beta y si quieres que te guarden tus datasets tendrás que donar algo. Si no, puedes generar tus datos online y descargarlos en tu PC o, incluso, descargarte su script en tu servidor y trabajar desde él.
Yo he hecho la prueba de la generación online de datos para MySQL y es altamente satisfactorio. He creado mi base de datos de VENTAS de una manera simple. Por ponerle una pega, te genera siempre 100 registros de cada tabla, pero la solución es fácil, generas varios ficheros SQL y sólo en el primero metes el CREATE TABLE y el DROP TABLE.
Solucionar problemas con el cotejamiento UTF8 – ISO 8859-1
Resulta que tengo una base de datos cuyo cotejamiento es ISO 8859-1.
No tenía ningún problema al mostrar los datos en mi página web debido a que tenía puesta la siguiente directiva:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
Además, los ficheros php que componen mi página los había generado con el Bloc de Notas, por lo que todo estaba correcto, todo funcionaba correctamente.
Desde que utilizo Aptana, me apetece migrar la página a UTF8. Se puede configurar en el Aptana para que los ficheros generados estén en ISO 8859-1, pero prefiero migrarlo todo a UTF8.
Comienzo a redactar la página, todo bien, en Aptana, con mis ficheros en UTF8, pero entonces surge un problema. Quiero hacer una página dinámica que lea de la base de datos. Por ahora no quiero migrar la base de datos a UTF8, debo mantenerla en ISO8859-1, ya que la página antigua sigue funcionando.
Si leo datos de la base de datos y los muestro en la página, aparecen caracteres raros para las ñ, tildes, diéresis y demás. ¿Cómo se soluciona esto?
Con PHP es fácil:
$cadenabien = utf8_encode($row[1]);
Suponiendo que $row es el resultado de una sentencia mysql_fetch_row.
La función utf8_encode() recibe una cadena de caracteres y la transforma al juego de caracteres UTF8.
Diagramas E/R con DIA
Dia, herramienta gratuita para crear diagramas entidad/relación
Dia es una aplicación para crear diagramas técnicos. Tiene versiones en Linux y Windows. Es Software Libre.
Instalar MySQL en Ubuntu
Ejecutamos la orden:
sudo apt-get install mysql-server
En primer lugar nos pregunta la contraseña del superusuario (root).
Después nos informará de que debe descargar X MB de Internet e instalarlos en nuestro equipo y que si deseamos continuar. Tras contestar con una simple S, instala MySQL y nos pregunta la contraseña del root de la base de datos:
Introducimos la contraseña del administrador de base de datos y continúa configurando la base de datos.
Ya tenemos MySQL instalado.
Paginación de registros
En situaciones en las cuales una consulta retorna muy muchos datos, en vez de enviarlos todos al navegador, se puede enviar un conjunto limitado de registros. Luego, mediante hipervínculos, ver el resto de datos. Por ejemplo, cuando hacemos búsquedas con el servidor google, generalmente no nos retorna todas las direcciones donde se encuentran los resultados buscados, nos retorna páginas con 10 enlaces por página (pensemos el tiempo de transferencia si nos retornara 1.000.000 de enlaces).
Bueno, ahora resolvamos con el lenguaje PHP este problema de paginación:
<?php
if (isset($_REQUEST['pos']))
$inicio=$_REQUEST['pos'];
else
$inicio=0;
?>
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$conexion=mysql_connect("localhost","root","") or
die("Problemas en la conexion");
mysql_select_db("base1",$conexion) or
die("Problemas en la selección de la base de datos");
$registros=mysql_query("select alu.codigo as
codigo,nombre,mail,codigocurso,
nombrecurso from alumnos as alu
inner join cursos as cur on cur.codigo=alu.codigocurso
limit $inicio,2", $conexion) or
die("Problemas en el select:".mysql_error());
$impresos=0;
while ($reg=mysql_fetch_array($registros))
{
$impresos++;
echo "Codigo:".$reg['codigo']."<br>";
echo "Nombre:".$reg['nombre']."<br>";
echo "Mail:".$reg['mail']."<br>";
echo "Curso:".$reg['nombrecurso']."<br>";
echo "<hr>";
}
mysql_close($conexion);
if ($inicio==0)
echo "anteriores ";
else
{
$anterior=$inicio-2;
echo "<a href=\"pagina1.php?pos=$anterior\">Anteriores </a>";
}
if ($impresos==2)
{
$proximo=$inicio+2;
echo "<a href=\"pagina1.php?pos=$proximo\">Siguientes</a>";
}
else
echo "siguientes";
?>
</body>
</html>
Hay muchas cosas importantes en este ejemplo, lo primero que vemos es el bloque que rescata a partir de qué registro ir mostrando:
if (isset($_REQUEST['pos'])) $inicio=$_REQUEST['pos']; else $inicio=0; ?>
La función isset retorna verdadero si existe la variable que le pasamos como parámetro, en este caso le estamos pasando la componente pos del vector asociativo $_REQUEST. Cuando llamamos por primera vez a esta página, lo hacemos : pagina1.php sin parámetros, por lo que el if se verifica como falso. Es decir la variable $inicio se carga con el valor 0.
Otro concepto importante es la cláusula limit que es propiedad del gestor MySQL. Mediante esta cláusula limitamos la cantidad de registros que retorna el select. El primer valor del limit indica a partir de cual registro y el segundo la cantidad de registros. Es decir si un select sin limit retorna 100 registro, luego utilizando por ejemplo la sintaxis limit 50,25 nos retornará, de esa lista de 100 registros, a partir del registro de la posición 50, 25 registros.
En nuestro problema indicamos que retorne desde valor que tenga la variable $inicio y como cantidad 2 (páginas con 2 registros):
$registros=mysql_query("select alu.codigo as codigo,nombre,mail,codigocurso, nombrecurso from alumnos as alu inner join cursos as cur on cur.codigo=alu.codigocurso limit $inicio,2", $conexion) or
Seguidamente mostramos todos los registros retornados y además los contamos:
$impresos=0; while ($reg=mysql_fetch_array($registros)) { $impresos++; echo "Codigo:".$reg['codigo']."<br>"; echo "Nombre:".$reg['nombre']."<br>"; echo "Mail:".$reg['mail']."<br>"; echo "Curso:".$reg['nombrecurso']."<br>"; echo "<hr>"; }
Ahora vemos dónde dispondremos los hipervínculos, hacia adelante o atrás:
if ($inicio==0) echo "anteriores "; else { $anterior=$inicio-2; echo "<a href=\"pagina1.php?pos=$anterior\">Anteriores </a>"; }
Si la variable $inicio vale 0 significa que no hay registros antes de éste, por lo que sólo mostramos un texto «anteriores». En caso que la variable $inicio sea distinta de 0, se ejecuta el else, donde disponemos un hipervínculo con la misma página e inicializando el parámetro pos con el valor de $inicio menos 2.
Si el contador $impresos tiene el valor 2 significa que posiblemente hay más registros por mostrar y debemos disponer un hipervínculo con la misma página pero inicializando el parámetro pos con el valor de $inicio más 2:
if ($impresos==2) { $proximo=$inicio+2; echo "<a href=\"pagina1.php?pos=$proximo\">Siguientes</a>"; } else echo "siguientes";
Consultas SELECT sobre BD Contactos
Una vez importada a MySQL la BD CONTACTOS.MDB hacer las siguientes consultas:
- Número de registros de la tabla Usuarios
- Nombre y apellidos de las personas que viven en Valencia.
- Nombre, apellidos y dirección de correo de las mujeres que no están casadas.
- Alias y número de teléfono de los hombres que tienen la EGB o el Bachillerato.
- Alias, número de teléfono móvil y dirección de correo de los hombres que hablan castellano y tienen los ojos marrones
- Alias de las mujeres que les gusta el deporte
- Alias de Mujeres heterosexuales o bisexuales que miden más de 1.60m
- Alias de Hombres que no tienen fobias y cuyos ingresos mensuales sean mayores de 1000 euros
- Número de hombres por cada ciudad
- Número medio de hijos que tienen las mujeres que pesan más de 70 kg
- Alias de las mujeres rubias de entre 25 y 40 años.
- Altura media de los hombres calvos
- Nombre de las ciudades en la que la media del peso de los hombres es superior a 80.
- Nombre de las ciudades en las que hay más de 5 mujeres dadas de alta