MySql game es un juego que me ha recordado mucho a los viejos MUD con una mezcla de juegos modernos estilo trivian u ogame.

La gran diferencia es que está dedicado a geeks de las bases de datos, en lugar de fundar un poblado o un planeta, empiezas insertando un registro en una tabla. Desde este registro puedes atacar a los registros de tus malvados rivales, y también debes defender el tuyo. Para ello cuentas con unidades de ataque y de defensa, multiplicadores, combustible (porque moverte de un registro de una base de datos es costoso) o dinero para comprar todo lo anterior.

Lo mas curioso, lo que hace distinto al juego, es que todas las órdenes que le das, son sentencias SQL, por ejemplo, para comprar unidades de ataque:

UPDATE rows SET attackers = attackers+1 WHERE row_id = 882;

Cada 10 segundos se actualiza el estado de tu registro y ganas dinero y combustible, y con el dinero compras unidades, o más defensa. Y todos los eventos que pasan alrededor de tu registro y de los demás, se pueden ver en el log de querys, los ataques contra tu registro son sentencias UPDATE que te quitan dinero e unidades, y se visualizan en color rojo (en el WHERE del ataque puedes ver el registro ofensor, para devolversela más tarde). Los ataques que tú realizas se marcan en naranja y las actualizaciones en azul. ¡Hasta el chat funciona con sentencias SQL!

Está dentro del motor de aplicaciones de google, por lo que, con una cuenta de gmail puedes crear tu propio registro para dominar la tabla completa BWAHAHA

Hace unos días que lo leí en Propiedad Privada, y parece que, como excepción, este caso de ayuda no es scam ni una estafa, es totalmente real y muy urgente.


Ivan, el hijo de dos años de de Andrii Nikitin, ingeniero de soporte para MySQL en Ukraina, necesita urgentemente un transplante de médula ósea, ya que los largos tratamientos a los que está siendo sometido en su país no están dando el resultado que los médicos esperaban. Los hospitales de su pais no están preparados para realizar una operación tan delicada a un niño tan jóven, por lo que tienen que trasladarlo a Alemania, y el coste de todo esto es algo que la familia de Andrii no puede afrontar, aún vendiendo su casa y todas sus posesiones.

Ivan ya está en Alemania y está siendo sometido a vigilancia y análisis. Por lo que parece, en el mejor de los casos, la operación se realizaría en dos meses.

Hasta ahora han reunido unos 90.000€ (unos 20.000€ proceden de la comunidad de MySQL), pero la clínica alemana ha previsto otros 150.000€ de gastos durante el proceso.

Si queréis ayudar a Ivan, podéis hacer donaciones desde la propia web que MySQL ha habilitado
: http://www.mysql.com/about/help-ivan.html

Detalles sobre el estado actual de Ivan aquí y aquí

MySQL nos proporciona dos maneras de "clonar" una tabla, tanto su estructura como su estructura y sus datos, podemos querer duplicar una tabla para hacer algún tipo de backup rápido, mantener un histórico, o migrar la tabla a un esquema o base de datos diferentes, entre otras cosas.

Clonar una tabla usando SELECT

La sentencia de creación CREATE TABLE (..) SELECT nos permite crear la tabla con los registros que devuelva la consulta de selección, pero tiene las siguientes limitaciones:

  • No traspasa las constraints de tipo PRIMARY KEY
  • No traspasa las definiciones de AUTO_INCREMENT
  • No traspasa las definiciones de DEFAULT CURRENT_TIMESTAMP
  • Utiliza el storage engine por defecto y no el de la tabla (en caso de que sean distintos)
  • Solamente traspasa los registros afectados por la SELECT, que podría no devolver ninguno y crear la tabla vacía

Normalmente los sistemas de programación y bases de datos nos proveen con una función relativamente simple cuya utilidad consiste en transformar la primera letra de una frase o palabra a mayúsculas, en php es ucfirst(), en Oracle es initcap (en el caso de transformar una frase, la función de Oracle pone cada primera palabra en mayúsculas), pero parece ser que MySQL no la tiene, por lo que tenemos que explorar un poco más y usar una solución más creativa.

Pongamos como ejemplo esta frase:
mysql> SET @frase = 'bienvenidos a cambrico.net';
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @frase;
+----------------------------+
| @frase |
+----------------------------+
| bienvenidos a cambrico.net |
+----------------------------+
1 row in set (0.00 sec)

Nota: He utilizado una variable de mysql con SET y @ para hacer las siguientes operaciones un poco mas simples.

Tenemos funciones como UPPER/UCASE y LOWER/LCASE para transformar a mayúsculas o minúsculas la cadena:
mysql> SELECT UPPER(@frase);
+----------------------------+
| UPPER(@frase) |
+----------------------------+
| BIENVENIDOS A CAMBRICO.NET |
+----------------------------+
1 row in set (0.00 sec)

Y para obtener la primera letra de la cadena en mayúsculas podemos utilizar un encadenado de las siguientes funciones: LEFT, para tomar el primer caracter de la izquierda y SUBSTR para coger los restantes, de esta forma tenemos aislada la primera letra. Aplicamos UPPER para transformarla en mayúsculas y unimos la cadena de nuevo con CONCAT (si tenemos sql_mode en ANSI_QUOTES, podemos usar ||)
mysql> SELECT CONCAT(UPPER(LEFT(@frase,1)),SUBSTR(@frase,2));
+------------------------------------------------+
| CONCAT(UPPER(LEFT(@frase,1)),SUBSTR(@frase,2)) |
+------------------------------------------------+
| Bienvenidos a cambrico.net |
+------------------------------------------------+
1 row in set (0.00 sec)

Actualizo: Para hacer lo que comenta Roberto, es decir, poner todas las palabras con la primera letra en mayúscula, tienes que hacer un procedimiento o una función (esto solo es posible a partir de MySQL 5.0). Os dejo un ejemplo:

Tras superar el examen Certified MySQL Developer - I, he pensado que sería útil para aquellos que se estén planteándo empezar a estudiar para obtener la certificación publicar algunos consejos o ideas que he usado.

Esta lista está orientada a Mysql 5.0, pero hay muchos puntos que podrían ser genéricos para otros exámenes / sistemas / versiones.

  1. El primer paso a tomar para empezar el camino de la certificación es adquirir la guía oficial de estudio: MySQL 5.0 Certification Study Guide, cuesta entre 20 y 35 euros (según pilléis la oferta de Amazon), y es realmente útil por cuatro motivos:
    • Os permitirá acostumbraros a la terminología en inglés, ya que los exámenes están en este idioma.
    • Cubre los cuatro exámenes principales, los dos de desarrollador y los dos de DBA, por lo que con un solo libro lo abarcáis todo.
    • Trae un CD con muchísimas preguntas (con sus respuestas), separadas por tema y exámen.
    • Viene con un 25% de descuento para un exámen, y puesto que los examenes rondan los 180€, solamente esto ya amortiza el libro.
  2. Fijad una fecha de examen en cuanto empecéis a estudiar (pero después de recibir el libro, para aprovechar el descuento del examen). La idea de tener una fecha límite ayuda mucho a no procrastinar con el estudio. Y si finalmente la fecha que habéis escogido os viene realmente mal, podéis cambiarla online hasta 24 horas antes.

Este mediodía he ido a uno de los centros asociados de PearsonVUE para realizar el primer examen correspondiente a la certificación de desarrollador en MySQL 5.0.
¡Y lo he aprobado! (aquí la prueba, que se que hay mucho incrédulo suelto ;))

El aprobado estaba en acertar 43 de las 70 preguntas y he acertado 62.

Ahora a preparar la segunda parte, a ver si antes de final de año lo saco.

Para insertar automáticamente la fecha y la hora, es decir, el timestamp, en un campo de tipo TIMESTAMP en una tabla en MySQL podemos utilizar CURRENT_TIMESTAMP, siempre que estemos utilizando una versión de servidor Mysql superior a la 4.1.
Si se utiliza el timestamp automático en las inserciones, cuando se omita el campo en una inserción, éste tomara el valor de fecha y hora que tenga el servidor en ese momento. Para esto se debe usar la propiedad DEFAULT CURRENT_TIMESTAMP en la creación del campo.
Si se utiliza en las actualizaciones, cuando se produzca una sentencia UPDATE que omita el campo que tiene la propiedad en el timestamp, el campo tomará el valor actual de fecha y hora del servidor. Para esto se debe usar la propiedad ON UPDATE CURRENT_TIMESTAMP en la creación del campo.

Se pueden usar por separado, o combinadas:

Tabla con un campo timestamp que toma un valor de fecha automático tanto en inserciones como actualizaciones

mysql> CREATE TABLE tabla_ejemplo1 (
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.09 sec)

Tabla con un campo timestamp que toma un valor de fecha automático tanto en inserciones pero NO en actualizaciones

mysql> CREATE TABLE tabla_ejemplo2 (
fecha TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.03 sec)

Tabla con un campo timestamp que toma un valor de fecha automático en actualizaciones pero NO en inserciones

mysql> CREATE TABLE tabla_ejemplo3 (
fecha TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Query OK, 0 rows affected (0.02 sec)

Ejemplo de inserción en una tabla con un campo DEFAULT CURRENT_TIMESTAMP

mysql> INSERT INTO tabla_ejemplo2 VALUES();
Query OK, 1 row affected (0.02 sec)
mysql> SELECT * FROM tabla_ejemplo2;
+---------------------+

Hay veces que realizamos operaciones de inserción que involucran valores autonuméricos y necesitamos averiguar el idetificador del último registro que hemos añadido para utilizarlo en verificaciones, o incluso en otras operaciones con la base de datos, como insertar registros hijos.

La función a utilizar en este caso sería last_insert_id(), a continuación muestro un ejemplo de su funcionamiento

He establecido un entorno de pruebas muy sencillo con un pequeño esquema que representa un sistema de autobuses y sus viajeros.

Optimizar el rendimiento de una base de datos puede ser una tarea muy compleja, ya que en muchas ocasiones no disponemos de suficiente información o la que tenemos nos hace intentar optimizar consultas o procesos que no merecerá la pena ser optimizados ya que el beneficio puede ser ínfimo.

MySQL pone a nuestra disposición una serie de parámetros y utilidades que pueden ahorrarnos mucho trabajo y facilitarnos la vida a la hora de intentar arreglar aquellas consultas de las que realmente podamos sacar una mejora sensible en el rendimiento.

El primer paso será activar el log dedicado al trazado de consultas lentas. Podémos comprobar fácilmente si lo tenemos ya activado utilizando este comando:

mysqladmin var |grep log_slow_queries
log_slow_queries | OFF

Si el resultado fuera ON, ya tenemos el parámetro activado, pero, al venir en estado OFF por defecto, lo más habitual será que no esté activado, por lo que deberemos activarlo.

Para sistemas Debian/Ubuntu, el fichero de configuración de MySQL normalmente estará en la ruta /etc/mysql/my.cnf , para activar la monitorización cambiaremos las siguientes líneas del fichero:

[mysqld]
long_query_time = 5
log-slow-queries = /var/log/mysql/mysql-slow.log

De esta forma le estamos indicando al servidor que monitoree las consultas más lentas de 5 segundos y guarde el log en /var/log/mysql/log-slow-queries.log (ambos parámetros se pueden ajustar a nuestras necesidades). Para que los cambios tengan efecto, se debe reiniciar el servidor MySQL (ojo, esto debe realizarse en un periodo en el que estemos seguros de que no va a afectar):

sudo /etc/init.d/mysql restart