Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

FAQ's de MySQL

Estas en el tema de FAQ's de MySQL en el foro de Mysql en Foros del Web. Inicio las FAQ's pura y exclusivamente de MySQL Espero que les sea útil... 1.- Como le doy formato a un campo fecha (datetime) ?? Cita: ...
  #1 (permalink)  
Antiguo 14/05/2007, 12:33
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 20 años, 4 meses
Puntos: 19
FAQ's de MySQL

Inicio las FAQ's pura y exclusivamente de MySQL

Espero que les sea útil...

1.- Como le doy formato a un campo fecha (datetime) ??


Cita:
DATE_FORMAT(date,format) Formats the date value according to the format string.
The following specifiers may be used in the format string. The ‘%’ character is required before format specifier characters.
Specifier Description
%a - Abbreviated weekday name (Sun..Sat)
%b - Abbreviated month name (Jan..Dec)
%c - Month, numeric (0..12)
%D - Day of the month with English suffix (0th, 1st, 2nd, 3rd, …)
%d - Day of the month, numeric (00..31)
%e - Day of the month, numeric (0..31)
%f - Microseconds (000000..999999)
%H - Hour (00..23)
%h - Hour (01..12)
%I - Hour (01..12)
%i - Minutes, numeric (00..59)
%j - Day of year (001..366)
%k - Hour (0..23)
%l - Hour (1..12)
%M - Month name (January..December)
%m - Month, numeric (00..12)
%p - AM or PM
%r - Time, 12-hour (hh:mm:ss followed by AM or PM)
%S - Seconds (00..59)
%s - Seconds (00..59)
%T - Time, 24-hour (hh:mm:ss)
%U - Week (00..53), where Sunday is the first day of the week
%u - Week (00..53), where Monday is the first day of the week
%V - Week (01..53), where Sunday is the first day of the week;used with %X
%v - Week (01..53), where Monday is the first day of the week; used with %x
%W - Weekday name (Sunday..Saturday)
%w - Day of the week (0=Sunday..6=Saturday)
%X - Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V
%x - Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v
%Y - Year, numeric, four digits %y Year, numeric (two digits)
%% - A literal ‘%’ character
%x - x, for any ‘x’ not listed above

Ranges for the month and day specifiers begin with zero due to the fact that MySQL allows the storing of incomplete dates such as '2004-00-00'.

As of MySQL 5.0.25, the language used for day and month names and abbreviations is controlled by the value of the lc_time_names system variable (Section 5.10.9, “MySQL Server Locale Support”).
As of MySQL 5.0.36, DATE_FORMAT() returns a string with a character set and collation given by character_set_connection and collation_connection so that it can return month and weekday names containing non-ASCII characters. Before 5.0.36, the return value is a binary string.
Código MySQL:
Ver original
  1. mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
  2.         -> 'Saturday October 1997'
  3.  
  4. mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
  5.         -> '22:23:00'
  6.  
  7. mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
  8.                           '%D %y %a %d %m %b %j');
  9.         -> '4th 97 Sat 04 10 Oct 277'
  10.  
  11. mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
  12.                           '%H %k %I %r %T %S %w');
  13.         -> '22 22 10 10:23:00 PM 22:23:00 00 6'
  14.  
  15. mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
  16.         -> '1998 52'
  17.  
  18. mysql> SELECT DATE_FORMAT('2006-06-00', '%d');
  19.         -> '00'
Ref. DATE_FORMAT()
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!

Última edición por gnzsoloyo; 18/10/2013 a las 08:22
  #2 (permalink)  
Antiguo 14/05/2007, 14:31
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 20 años, 4 meses
Puntos: 19
Re: FAQ's de MySQL

Pregunta: Que herramientas puedo usar para conectarme a MySQL?
Respuesta: Personalmente conozco tres formas de conectarme a MySQL.

1.- Linea de comando (Valido para Windows y Linux)

Tipean esto en la linea de comando, la opcion -u indica el usuario que se escribe seguido de esta opcion, en el caso que querramos conectarnos a otro servidor distinto debemos especificar el host con la opcion -h seguido del numero de ip o nombre de dominio. Y de esto modo tambien tenemos que tener en cuenta a que puerto debemos conectarnos, por defecto MySQL tiene el puerto 3306. El administrador lo puede cambiar del archivo de configuración. my.cfg para esto tenemos que usar la opcion -P seguido del puerto.

Ejemplos:

Local
>mysql -u root -p
Enter Password: ******

A un servidor (dominio.com - puerto:3305)
>mysql -h dominio.com -P 3305 -u root -p
Enter Password: ******

También podemos usar programas como SQLYog que se siente bastante comodo, de aca pueden descargar una version gratuita. (Community Edition)

Y el archi conocido PHPMyADMIN que funciona con apache.

http://www.phpmyadmin.net/home_page/index.php

Espero que les sirva.

saludos

http://www.webyog.com/en/downloads.php
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!
  #3 (permalink)  
Antiguo 18/05/2007, 14:22
Avatar de BrujoNic
Super Moderador
 
Fecha de Ingreso: noviembre-2001
Ubicación: Costa Rica/Nicaragua
Mensajes: 16.935
Antigüedad: 22 años, 5 meses
Puntos: 655
Re: FAQ's de MySQL

Como un aporte adicional, recomiendo bajar el manual de MySQL directamente de su sitio. Está en varios idiomas.
__________________
La tecnología está para ayudarnos. No comprendo el porqué con esa ayuda, la gente escribe TAN MAL.
NO PERDAMOS NUESTRO LINDO IDIOMA ESPAÑOL
  #4 (permalink)  
Antiguo 18/05/2007, 17:48
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 20 años, 4 meses
Puntos: 19
Re: FAQ's de MySQL

Te dejo el link al manual on line ...

http://dev.mysql.com/doc/refman/5.0/es/index.html

---------------------------------------------------------------

Pregunta: Como puedo conocer el proximo id de un campo `auto_increment`

respuesta:

Suponiendo que tenemos una tabla con la siguiente estructura.

Código MySQL:
Ver original
  1. usuarios  CREATE TABLE `usuarios` (                                                          
  2. `id` int(11) NOT NULL auto_increment,                                            
  3. `usuario` varchar(255),
  4. `password` varchar(255),
  5. PRIMARY KEY  (`id`)                                                              
  6. )

Usamos esta consulta para saber el proximo id, para hacer la prueba insertamos varios registros y vamos viendo el resultado que nos devuelve la consulta.

Código MySQL:
Ver original
  1. FROM `information_schema`.`tables`
  2.        TABLE_SCHEMA = "test" AND TABLE_NAME = "usuarios"

test = Nombre de la base de datos
usuarios = Nombre del campo

Espero que les sea útil ...
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!

Última edición por gnzsoloyo; 09/10/2012 a las 11:43
  #5 (permalink)  
Antiguo 02/06/2007, 18:19
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Exclamación Re: FAQ's de MySQL

Mi aporte a este foro que me ha dado tanto...

Pregunta:Qué tipo de tablas usar para mi proyecto, myisam, innodb??
Respuesta:

Pues debes tener en cuenta una cosa:

Si tu tabla requiere foreingn key(llaves foraneas, fk), pues lo ideal serìa que fuera innodb, por que hará respetar la integridad referencial de tu DB, e iràs a la fija sabiendo que no permitirá datos que no vengan de una tabla relacionada a esa, ya que las tablas tipo myisam no te respetan eso y te permiten "introducir lo que quieras".

Ahora bien, si tu tabla no requiere fk, puedes dejarla myisam, por que no necesitas validar para esa tabla la integridad referencial, lo que te permitirá realizar consultas de más rápido con respecto a innodb.

Saludos y espero que sea un buen aporte!!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com

Última edición por Carxl; 05/04/2010 a las 15:28
  #6 (permalink)  
Antiguo 02/06/2007, 18:37
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Exclamación Re: FAQ's de MySQL

Otro aporte mas...

Pregunta: No tengo activada tipo de tabla innodb?? Còmo la activo?
Repuesta:

La respuesta que doy, aplica para myql 5, creo que en mysql 4 no estaban, creo .

Ya sea con un paquete todo en uno (xampp, wamp) o en tu instalaciòn personalizada de mysql, dirìgete a la carpeta mysql y luego a la que dice "bin".

Normalmente, aparece un icono en forma de computador llamado "my". Ábrelo con bloc de notas, note pad o un editor de texto, como quieras y busca la línea que diga: skip-innodb, verás en esa lìnea un ";" punto y coma, quítaselo y guarda la modificación.

Para aquellos que trabajen con el appserv, sòlo se mofica un poco la explicaciòn anterior, para habilitar las tablas innodb, procedan de la siguiente manera, es muy facil. Simplemente localicen la ruta C:Appserv/mysql/my.ini, luego ubiquen la linea: skip-innodb. Y agreguen # al principio, es decir que les deberia quedar asi:
#skip-innodb
(Crèditos: cala932)

Guarden los cambios y reinicien el mysql.

Si estabas con los servicios arriba de mysql cuando hiciste esto, el semàforo en verde o en tu panel decía "Running", baja los servicios, y vuelvelos a iniciar.

En el phpmyadmin te muestra los tipos de tablas que están actualmente activas y verás a innodb!!!

Listo!!! ya tienes innodb activadas!!, ya puedes hacer DB utilizándolas!!

Saludos!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com

Última edición por Carxl; 09/08/2007 a las 12:58 Razón: Actualizaciòn como hacerlo en Appserv
  #7 (permalink)  
Antiguo 19/07/2007, 09:31
Avatar de cala932  
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Re: FAQ's de MySQL

Hola, pienso que puede llegar a ser de mucha utilidad, lo dejo para la comunidad:
Pregunta: Como reestablezco la contraseña del root, si olvide la que tenia???

Cita:
En windows:

1.Entre en su sistema como Administrador.

2. Pare el servidor MySQL si se está ejecutando. Para servidores que se estén ejecutando como servicio de Windows, vaya al Gestor de Servicios:
Menú Inicio -> Panel de Control -> Herramientas administrativas -> Servicios
Después encuentre en la lista el servicio MySQL, y parelo.
Si su servidor no está ejecutándose como servicio, podría necesitar utilizar el Gestor de tareas para forzarlo a parar

3.Cree un archivo de texto e introduzca el siguiente comando en él, en una única línea:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MiNuevaContraseña');

4.Guarde el archivo con cualquier nombre. Para este ejemplo, el nombre del archivo será C:\mysql-init.txt.

5.Abra una ventana de comandos para obtener una consola de comandos DOS:
Menú Inicio -> Ejecutar -> cmd

6.Asumiremos que usted tiene instalado MySQL en C:\mysql. Si lo intaló en algún otro lugar, ajuste los siguientes comandos de manera adecuada.
En la línea de comandos DOS, ejecute esta orden:

C:\> C:\mysql\bin\mysqld-nt --init-file=C:\mysql-init.txt

Los contenidos del archivo nombrado por la opción --init-file son ejecutados en el inicio del servidor, cambiando la contraseña de root. Cuando el servidor se haya iniciado correctamente, debería borrar el archivo C:\mysql-init.txt.
Los usuarios de MySQL 4.1 y superiores que instalen MySQL utilizando el instalador de mySQL, pueden necesitar especificar una opción --defaults-file:
C:\> C:\Archivos de Programa\MySQL\MySQL Server 5.0\bin\mysqld-nt.exe
--defaults-file="C:\Archivos de Programa\MySQL\MySQL Server 5.0\my.ini"
--init-file=C:\mysql-init.txt

La configuración apropiada de --defaults-file puede encontrarse utilizando el Gestor de Servicios:
Menú Inicio -> Panel de Control -> Herramientas Administrativas -> Servicios

Encuentre el servicio MySQL en la lista, pulse con el botón derecho del ratón, y escoja la opción Propiedades. El campo Ruta al Ejecutable contiene la configuración de --defaults-file.

7.Pare el servidor MySQL, y reinícielo en modo normal de nuevo. Si ejecuta el servidor como servicio, inícielo desde la ventana de servicios de Windows. Si ejecuta el servidor manualmente, utilice el comando que normalmente use.

8.Debería poder conectar utilizando la nueva contraseña .


En un entorno Unix, el procedimiento para restablecer la contraseña root es el siguiente:

1. Entre en sus sitema como usuario Unix root o bien como el mismo usuario que ejecuta el servidor mysqld.
2. Localice el archivo .pid que contiene el ID de proceso del servidor. La localización exacta y el nombre de este archivo depende de su distribución, nombre de máquina, y configuración. Lugares comunes son /var/lib/mysql/, /var/run/mysqld/, y /usr/local/mysql/data/.

Generalmente, el archivo tiene una extensión .pid y comienza con mysqld o el nombre de su máquina.

Puede parar el servidor MySQL enviando un comando kill (no kill -9) a el proceso mysqld utilizando la ruta del archivo .pid en el siguiente comando:

shell> kill `cat /mysql-data-directory/host_name.pid`

Nótese el uso de acentos abiertos en vez de comillas simples con el comando cat; estos causan que la salida de cat sea sustituida en el comando kill.

3. Cree un archivo de texto e introduzca el siguiente comando en una única línea:

4. SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MiNuevaContraseña');

Guarde el archivo con cualquier nombre. Para este ejemplo, el archivo tendrá el nombre ~/mysql-init.

5. Reinicie el servidor MySQL con la opción especial --init-file=~/mysql-init:

6. shell> mysqld_safe --init-file=~/mysql-init &

Los contenidos del archivo son ejecutados al inicio del servidor, cambiando la contraseña de root. Después de que el servidor se haya iniciado con éxito, debería borrar ~/mysql-init.

7. Debería poder conectar utilizando la nueva contraseña.


Una alternativa, en cualquier plataforma, es establecer la nueva contraseña desde el cliente mysql (pero esta manera es menos segura):

1. Pare mysqld y reinícielo con la opción --skip-grant-tables --user=root (Los usuarios de Windows deben omitir la parte de --user=root).
2. Conecte al servidor mysqld con este comando:
3. shell> mysql -u root
4. Ejecute las siguientes sentencias en el cliente mysql:
5. mysql> UPDATE mysql.user SET Password=PASSWORD('nuevacontraseña')
6. -> WHERE User='root';
7. mysql> FLUSH PRIVILEGES;

Reemplace “nuevacontraseña” con la contraseña de root real que quiere utilizar.

8. Debería poder conectar utilizando la nueva contraseña.
Referencia: EN MYSQL

Saludos
__________________
->Aprender es un proceso que incluye el error..
  #8 (permalink)  
Antiguo 18/10/2007, 09:54
Avatar de rogertm
Mod->Cuba
 
Fecha de Ingreso: julio-2005
Ubicación: /home/Cuba/Habana/rogertm/
Mensajes: 2.922
Antigüedad: 18 años, 8 meses
Puntos: 638
Re: FAQ's de MySQL

Hola por aca, creo que esta no puede faltar:

Tipos de datos en MySQL:
Cita:
1. Acerca de este artículo

Este documento corresponde a la traducción del tema 6.2 (Column Types) del manual de MySQL en Inglés, y ha sido puesto a disposición de MySQL Hispano por Mario Alberich Piqué.

2. Introducción

MySQL soporta varios tipos de datos, que pueden ser agrupados en tres categorías: numéricos, fecha y hora, y cadenas (caracteres). En este artículo se presenta un breve resumen de estos tipos, se mencionan sus requerimientos de almacenamiento, y se hace una descripción más detallada de las propiedades de cada uno de ellos. Los tipos de datos soportados por MySQL son listados a continuación.

Sigue la fuente: http://www.mysql-hispano.org/page.php?id=22
saludos y suerte
__________________
Friki y Blogger por Cuenta Propia:213
Twenty'em: Theming is Prose
  #9 (permalink)  
Antiguo 14/12/2007, 07:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Re: FAQ's de MySQL

Método para perimitir ingresar caracteres en españos y que no los tome como iguales.
Agradecimeinto a William Chiquito (Foro Spanish de MySQL.com) por esta magífica solución.

El problema era una tabla con PK tipo VARCHAR y que no tomaba "campaña" y "campana" como claves distintas, quedando solamente "campana". W. Chiquito mandó esta solución:

Cita:
Te muestro mi ejemplo:

CREATE TABLE `t2` (
`clave` varchar(20) character set utf8 NOT NULL default '',
PRIMARY KEY (`clave`)
) ENGINE=InnoDB;

INSERT INTO t2 (clave) VALUES ('campana');
INSERT INTO t2 (clave) VALUES ('campaña');
INSERT INTO t2 (clave) VALUES ('canción');
INSERT INTO t2 (clave) VALUES ('cancion');Resultado:

(1 row(s)affected)
(0 ms taken)

Error Code : 1062
Duplicate entry 'campaña' for key 1
(0 ms taken)

(1 row(s)affected)
(0 ms taken)

Error Code : 1062
Duplicate entry 'cancion' for key 1
(0 ms taken)

SELECT * FROM t2;Resultado:

clave
--------
campana
canción

DROP TABLE IF EXISTS t2;

CREATE TABLE `t2` (
`clave` varchar(20) collate latin1_spanish_ci NOT NULL default '',
PRIMARY KEY (`clave`)
) ENGINE=InnoDB;

INSERT INTO t2 (clave) VALUES ('campana');
INSERT INTO t2 (clave) VALUES ('campaña');
INSERT INTO t2 (clave) VALUES ('canción');
INSERT INTO t2 (clave) VALUES ('cancion');Resultado:

(1 row(s)affected)
(0 ms taken)

(1 row(s)affected)
(0 ms taken)

(1 row(s)affected)
(0 ms taken)

Error Code : 1062
Duplicate entry 'cancion' for key 1
(0 ms taken)

SELECT * FROM t2;Resultado:

clave
--------
campana
campaña
canción

DROP TABLE IF EXISTS t2;

CREATE TABLE `t2` (
`clave` varchar(20) character set latin1 collate latin1_bin NOT NULL default '',
PRIMARY KEY (`clave`)
) ENGINE=InnoDB;

INSERT INTO t2 (clave) VALUES ('campana');
INSERT INTO t2 (clave) VALUES ('campaña');
INSERT INTO t2 (clave) VALUES ('canción');
INSERT INTO t2 (clave) VALUES ('cancion');Resultado:

(1 row(s)affected)
(0 ms taken)

(1 row(s)affected)
(0 ms taken)

(1 row(s)affected)
(0 ms taken)

(1 row(s)affected)
(0 ms taken)

SELECT * FROM t2;Resultado:

clave
--------
campana
campaña
cancion
canción
  #10 (permalink)  
Antiguo 02/07/2008, 08:55
 
Fecha de Ingreso: junio-2008
Ubicación: Cali, Colombia
Mensajes: 74
Antigüedad: 15 años, 9 meses
Puntos: 3
Respuesta: Re: FAQ's de MySQL

Tambien se Puede Utilizar para conectarte a MySQL el:

MySQL-GUI-TOOLS, sirve para administrar, consultar, exportar y monitorear tu BD MySQL

Bye
  #11 (permalink)  
Antiguo 02/07/2008, 08:58
 
Fecha de Ingreso: junio-2008
Ubicación: Cali, Colombia
Mensajes: 74
Antigüedad: 15 años, 9 meses
Puntos: 3
Respuesta: Re: FAQ's de MySQL

Pregunta: Como resto dos tiempos en MySQL?
Respuesta: con la funcion de MySQL TIMEDIFF
Ejemplo
Código MySQL:
Ver original
  1. (SELECT TIMEDIFF(Tiempo1,Tiempo2))

Última edición por gnzsoloyo; 09/10/2012 a las 11:45
  #12 (permalink)  
Antiguo 02/07/2008, 09:02
 
Fecha de Ingreso: junio-2008
Ubicación: Cali, Colombia
Mensajes: 74
Antigüedad: 15 años, 9 meses
Puntos: 3
Respuesta: Re: FAQ's de MySQL

Pregunta: Como trabajar con intervalos de fechas?
Respuesta:
Código MySQL:
Ver original
  1. campo_fecha >= STR_TO_DATE('2008-07-01','%Y-%m-%d') AND campo_fecha <= STR_TO_DATE('2008-07-02','%Y-%m-%d')

Última edición por gnzsoloyo; 09/10/2012 a las 11:45
  #13 (permalink)  
Antiguo 28/02/2009, 18:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FAQ's de MySQL

Pregunta: ¿Cómo numerar secuencialmente una consulta, sin usar PK?
Respuesta:
Numerar dinámicamente con variables de usuario. Ocasionalmente alguien realiza una consulta a una tabla y por cuestiones de comodidad quiere que los registros obtenidos sean numerados, pero la tabla o no tiene ID autonumérico o bien el mismo tiene "huecos" en la numeración o al menos números faltantes.

Bueno, para hacer que MySQL numere en una columna en forma directa una tabla recuperada de una consulta hay que usar una variable de tipo global y realizar la consulta como subconsulta, de esta forma:
Código sql:
Ver original
  1. SELECT
  2.     (@REG := @REG + 1) Linea,
  3.     Campo1,
  4.     Campo2,
  5.     Campo3
  6. FROM
  7.     (SELECT
  8.         @REG :=0,
  9.         Campo1,
  10.         Campo2,
  11.         Campo3
  12.     FROM Tabla1) Tabla2;

Debe forzosamente hacer la definición de la variable global dentro de la subconsulta para que la misma pueda existir, sin lo cual el resultado de la columna Linea se vuelve NULL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 18/04/2010 a las 07:35
  #14 (permalink)  
Antiguo 15/04/2009, 10:39
Avatar de gusma62  
Fecha de Ingreso: julio-2008
Ubicación: Tepatitlán, Jalisco, Mexico
Mensajes: 167
Antigüedad: 15 años, 9 meses
Puntos: 6
Respuesta: FAQ's de MySQL

Pregunta: ¿Cómo respaldar mi base de datos?

Una forma es desde la linea de comandos:

Código:
C:\AppServ\MySQL\bin>mysqldump -u root -p base_de_datos > archivo_respaldo.sql
Pedirá la contraseña y listo!

La ruta depende de donde tengas instalado mysql.
root es el usuario.
El archivo se guarda en la carpeta bin.


Y para restaurar una base de datos desde un archivo:

Código:
C:\AppServ\MySQL\bin>mysql -u root -p base_de_datos < archivo_origen.sql
Ojo: es solo mysql, el anterio era mysqldump. Tambien cuidado con el signo <
La base de datos debe estar creada antes de la modificacion.
El archivo origen debe estar en la carpeta bin
  #15 (permalink)  
Antiguo 18/07/2009, 07:18
Avatar de thesixhalcon  
Fecha de Ingreso: noviembre-2007
Ubicación: Madrid (España)
Mensajes: 55
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: FAQ's de MySQL

Pregunta: ¿Cómo usar Foreign Keys en MySQL?
Respuesta:

En este sitio nos explican de manera simple, clara y con un ejemplo práctico cómo usar las Foreign Keys en MySQL. De manera complementaria recomiendo comprender las diferencias entre MyISAM e InnoDB informandose en la documentaición oficial de MySQL.
__________________
Respondo a MP, si de verdad es necesario. No pidas que te den el código hecho, pide el método y aprende de él.
lowsession.com - ¡La noche es tuya!

Última edición por thesixhalcon; 18/07/2009 a las 07:58
  #16 (permalink)  
Antiguo 22/07/2009, 09:08
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: FAQ's de MySQL

Pregunta: Como puedo agrupar en un solo registro todos los valores para un campo determinado?
Respuesta: Con la función group_concat

Ejemplo:

Código mysql:
Ver original
  1. mysql> create table persona_deporte(persona varchar(20),deporte varchar(20));
  2. Query OK, 0 rows affected (0.06 sec)
  3.  
  4. mysql> insert into persona_deporte values('Daniel','Futbol');
  5. Query OK, 1 row affected (0.00 sec)
  6.  
  7. mysql> insert into persona_deporte values('Daniel','Baloncesto');
  8. Query OK, 1 row affected (0.00 sec)
  9.  
  10. mysql> insert into persona_deporte values('Daniel','valley ball');
  11. Query OK, 1 row affected (0.00 sec)
  12.  
  13. mysql> insert into persona_deporte values('Juan','Tennis');
  14. Query OK, 1 row affected (0.00 sec)
  15.  
  16. mysql> insert into persona_deporte values('Juan','Futbol');
  17. Query OK, 1 row affected (0.00 sec)
  18.  
  19. mysql> insert into persona_deporte values('Santiago','Waterpolo');
  20. Query OK, 1 row affected (0.00 sec)
  21.  
  22. mysql> insert into persona_deporte values('Santiago','Baloncesto');
  23. Query OK, 1 row affected (0.00 sec)
  24.  
  25. mysql> select *from persona_deporte;
  26. +----------+-------------+
  27. | persona  | deporte     |
  28. +----------+-------------+
  29. | Daniel   | Futbol      |
  30. | Daniel   | Baloncesto  |
  31. | Daniel   | valley ball |
  32. | Juan     | Tennis      |
  33. | Juan     | Futbol      |
  34. | Santiago | Waterpolo   |
  35. | Santiago | Baloncesto  |
  36. +----------+-------------+
  37. 7 rows in set (0.00 sec)
  38.  
  39. mysql> select persona,group_concat(deporte separator " - ") deportes from persona_deporte group by persona;
  40. +----------+-----------------------------------+
  41. | persona  | deportes                          |
  42. +----------+-----------------------------------+
  43. | Daniel   | Futbol - Baloncesto - valley ball |
  44. | Juan     | Tennis - Futbol                   |
  45. | Santiago | Waterpolo - Baloncesto            |
  46. +----------+-----------------------------------+
  47. 3 rows in set (0.00 sec)
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #17 (permalink)  
Antiguo 06/09/2009, 18:28
Avatar de thesixhalcon  
Fecha de Ingreso: noviembre-2007
Ubicación: Madrid (España)
Mensajes: 55
Antigüedad: 16 años, 5 meses
Puntos: 1
Respuesta: FAQ's de MySQL

Pregunta: Tengo una base de datos enorme y hay bastantes valores repetidos en una tabla que me gustaría borrar. ¿Cómo lo hago?

Respuesta:
Seguro que muchos de vosotros habéis tenido un problema parecido y probablemente no hayais encontrado una manera genérica de hacerlo, bien, pues aquí lo dejo:
Código sql:
Ver original
  1. SELECT a.columna
  2. FROM tabla AS a
  3. WHERE (SELECT COUNT(*)
  4.              FROM tabla AS b
  5.              WHERE a.columna = b.columna) > 1

Esta de aquí para que sólo os aparezcan una muestra de lo repetido (Sólo se añade un DISTINCT):
Código sql:
Ver original
  1. SELECT DISTINCT a.columna
  2. FROM tabla AS a
  3. WHERE (SELECT COUNT(*)
  4.              FROM tabla AS b
  5.              WHERE a.columna = b.columna) > 1

EDITO:
Otra forma de hacerlo, gracias a huesos52, es:
Código sql:
Ver original
  1. SELECT *
  2. FROM tabla
  3. GROUP BY campo
  4. HAVING COUNT(*) > 1;

Un saludo!
__________________
Respondo a MP, si de verdad es necesario. No pidas que te den el código hecho, pide el método y aprende de él.
lowsession.com - ¡La noche es tuya!

Última edición por gnzsoloyo; 23/11/2012 a las 13:17 Razón: legibilidad de cosultas
  #18 (permalink)  
Antiguo 22/09/2009, 12:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FAQ's de MySQL

ELIMINAR LETRAS DE UNA CADENA Y RECUPERAR UN ENTERO:
Una función para eliminar de una cadena los caracteres alfabéticos y dejar solamente números.
Es útil para aquellos casos en los que se hayan dejado ingresar en un campo que debe contener número caracteres alfabéticos y se los quiere eliminar.
Código sql:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP FUNCTION IF EXISTS `FN_ONLYNUM` $$
  4. CREATE FUNCTION `FN_ONLYNUM` (VAR CHAR(100)) RETURNS CHAR(100)
  5. DETERMINISTIC
  6. BEGIN
  7.   DECLARE POS INT DEFAULT 1;
  8.   DECLARE TOTAL CHAR(100) DEFAULT '';
  9.   DECLARE VALOR INT DEFAULT 0;
  10.   REPEAT
  11.     IF INSTR('0123456789', SUBSTRING(VAR, POS, 1))>0 THEN
  12.       SET TOTAL = CONCAT(TOTAL,SUBSTRING(VAR, POS, 1));
  13.     END IF;
  14.     SET POS = POS + 1;
  15.   UNTIL POS > LENGTH(VAR) END REPEAT;
  16.   RETURN CAST(TOTAL AS SIGNED INTEGER);
  17. END $$
  18.  
  19. DELIMITER ;
  20.  
  21. mysql> SELECT FN_ONLYNUM('M1010');
  22. +---------------------+
  23. | FN_ONLYNUM('M1010') |
  24. +---------------------+
  25. | 1010                |
  26. +---------------------+
  27. 1 ROW IN SET (0.06 sec)
  28.  
  29.  
  30. mysql> SELECT CAST(FN_ONLYNUM('M1010') AS UNSIGNED) NUMERO;
  31. +--------+
  32. | NUMERO |
  33. +--------+
  34. |   1010 |
  35. +--------+
  36. 1 ROW IN SET (0.02 sec)


Esta función puede ser reescrita para recuperar sólo letras, decimales, flotantes, etc.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 02/09/2013 a las 17:55
  #19 (permalink)  
Antiguo 28/01/2010, 00:38
 
Fecha de Ingreso: agosto-2008
Mensajes: 82
Antigüedad: 15 años, 8 meses
Puntos: 4
De acuerdo Respuesta: FAQ's de MySQL

PRÓXIMOS CUMPLEAÑOS

¡Saludos!

Ya tenía demasiado tiempo sin andar por éstos rumbos.

El motivo de mi post es porque hace un rato se me ocurrió hacer un query de los próximos cumpleaños, con cierto rango de días (en éste caso usaremos 5)...

Bien... pues aquí está mi Query:

Código MySQL:
Ver original
  1. SELECT ID, NOMBRE, CONCAT(YEAR(NOW()), '-', DATE_FORMAT(BIRTH,'%m-%d'))BIRTHDAY
  2. FROM USUARIOS
  3. WHERE DATE_FORMAT(BIRTH,'%m-%d')
  4. ORDER BY DATE_FORMAT(BIRTH,'%m-%d') ASC;

El año presente debe concatenarse para saber que día de la semana se le celebrará, etc...

Recordar que si estas trabajando en .NET y tu GridView tiene AutoGenerateColumns="True", debes agregar el CAST AS STRING a tu columna de fecha... de lo contrario no la toma en centa...

Espero les sea de gran ayuda...

Nos seguimos leyendo...

Última edición por NA1TM3R; 28/01/2010 a las 00:44
  #20 (permalink)  
Antiguo 30/01/2010, 15:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FAQ's de MySQL

Este es un stored procedure que surgió de la pregunta de un post. Devuelve una tabla de días entre dos fechas.
Para el que lo necesite, esto sería:
Código MySQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `DIAS_PERIODO` $$
  4. CREATE PROCEDURE `DIAS_PERIODO`(IN DESDE DATE, IN HASTA DATE)
  5.   DECLARE FIN INT DEFAULT 0;
  6.   DECLARE DIA DATE;
  7.   SET DIA = DESDE;
  8.   CREATE TEMPORARY TABLE DIAS(FECHA DATE);
  9.   CICLO1: REPEAT
  10.     SET DIA = ADDDATE(DIA, INTERVAL 1 DAY);
  11.     SET FIN = FIN + 1;
  12.     INSERT INTO DIAS VALUES(DIA);
  13.   UNTIL DIA = HASTA END REPEAT CICLO1;
  14.   SELECT * FROM DIAS;
  15. END $$
  16.  
  17. DELIMITER ;

Nota: Como la tabla está declarada como TEMPORARY, sólo existirá dentro de la ejecución de la sentencia y será inaccesible fuera de la conexión y tiempo de ejecución de la misma, luego de lo cual se borra.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #21 (permalink)  
Antiguo 09/02/2010, 16:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: FAQ's de MySQL

Pregunta: Como manejar transacciones en mysql?
Respuesta: Ver ejemplo

Código MySQL:
Ver original
  1. mysql> SELECT *FROM tabla1;
  2. +----------+---------+-----------------+
  3. | idextra1 | nombre1 | detalle1        |
  4. +----------+---------+-----------------+
  5. |        1 | daniel  | detalle daniel  |
  6. |        2 | daniela | detalle daniela |
  7. +----------+---------+-----------------+
  8. 2 rows IN SET (0.25 sec)
  9.  
  10. Query OK, 0 rows affected (0.00 sec)
  11.  
  12. mysql> INSERT INTO tabla1 VALUES(3,'salome','detalle salome');
  13. Query OK, 1 row affected (0.00 sec)
  14.  
  15. mysql> INSERT INTO tabla1 VALUES(4,'cristian','detalle cristian');
  16. Query OK, 1 row affected (0.00 sec)
  17.  
  18. mysql> SELECT *FROM tabla1;
  19. +----------+----------+------------------+
  20. | idextra1 | nombre1  | detalle1         |
  21. +----------+----------+------------------+
  22. |        1 | daniel   | detalle daniel   |
  23. |        2 | daniela  | detalle daniela  |
  24. |        3 | salome   | detalle salome   |
  25. |        4 | cristian | detalle cristian |
  26. +----------+----------+------------------+
  27. 4 rows IN SET (0.00 sec)
  28.  
  29. mysql> ROLLBACK;
  30. Query OK, 0 rows affected (0.00 sec)
  31.  
  32. mysql> SELECT *FROM tabla1;
  33. +----------+---------+-----------------+
  34. | idextra1 | nombre1 | detalle1        |
  35. +----------+---------+-----------------+
  36. |        1 | daniel  | detalle daniel  |
  37. |        2 | daniela | detalle daniela |
  38. +----------+---------+-----------------+
  39. 2 rows IN SET (0.00 sec)
  40.  
  41. Query OK, 0 rows affected (0.00 sec)
  42.  
  43. mysql> INSERT INTO tabla1 VALUES(3,'salome','detalle salome');
  44. Query OK, 1 row affected (0.00 sec)
  45.  
  46. mysql> savepoint a;
  47. Query OK, 0 rows affected (0.00 sec)
  48.  
  49. mysql> INSERT INTO tabla1 VALUES(4,'cristian','detalle cristian');
  50. Query OK, 1 row affected (0.00 sec)
  51.  
  52. mysql> rollback to a;
  53. Query OK, 0 rows affected (0.00 sec)
  54.  
  55. mysql> select *from tabla1;
  56. +----------+---------+-----------------+
  57. | idextra1 | nombre1 | detalle1        |
  58. +----------+---------+-----------------+
  59. |        1 | daniel  | detalle daniel  |
  60. |        2 | daniela | detalle daniela |
  61. |        3 | salome  | detalle salome  |
  62. +----------+---------+-----------------+
  63. 3 rows in set (0.00 sec)
  64.  
  65. mysql> SELECT *FROM tabla1;
  66. +----------+---------+-----------------+
  67. | idextra1 | nombre1 | detalle1        |
  68. +----------+---------+-----------------+
  69. |        1 | daniel  | detalle daniel  |
  70. |        2 | daniela | detalle daniela |
  71. +----------+---------+-----------------+
  72. 2 rows IN SET (0.25 sec)
  73.  
  74. Query OK, 0 rows affected (0.00 sec)
  75.  
  76. mysql> INSERT INTO tabla1 VALUES(3,'salome','detalle salome');
  77. Query OK, 1 row affected (0.00 sec)
  78.  
  79. mysql> INSERT INTO tabla1 VALUES(4,'cristian','detalle cristian');
  80. Query OK, 1 row affected (0.00 sec)
  81.  
  82. mysql> SELECT *FROM tabla1;
  83. +----------+----------+------------------+
  84. | idextra1 | nombre1  | detalle1         |
  85. +----------+----------+------------------+
  86. |        1 | daniel   | detalle daniel   |
  87. |        2 | daniela  | detalle daniela  |
  88. |        3 | salome   | detalle salome   |
  89. |        4 | cristian | detalle cristian |
  90. +----------+----------+------------------+
  91. 4 rows IN SET (0.00 sec)
  92.  
  93. mysql> commit;
  94. Query OK, 0 rows affected (0.00 sec)
  95.  
  96. mysql> SELECT *FROM tabla1;
  97. +----------+----------+------------------+
  98. | idextra1 | nombre1  | detalle1         |
  99. +----------+----------+------------------+
  100. |        1 | daniel   | detalle daniel   |
  101. |        2 | daniela  | detalle daniela  |
  102. |        3 | salome   | detalle salome   |
  103. |        4 | cristian | detalle cristian |
  104. +----------+----------+------------------+
  105. 4 rows IN SET (0.00 sec)
Explicación

Después de iniciada una transacción se pueden realizar 3 acciones:
Commit -> Confirmar cambios definitivos. (Esto termina la transacción)
savepoint -> Confirmar hasta cierto punto de los procesos sin finalizar la transacción.
rollback -> Deshacer cambios desde el inicio de la transacción. (Esto también finaliza la transacción)

Como se muestra en el ejemplo, también se puede hacer rollback hasta el ultimo savepoint guardado.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 09/02/2010 a las 20:41
  #22 (permalink)  
Antiguo 15/04/2010, 12:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FAQ's de MySQL

Pregunta: Renumerar un campo auto_increment
Respuesta: No es conveniente y es innecesario hacerlo.

a) Un campo AUTO_INCREMENT en MySQL es normalmente usado como PRIMARY KEY.
b) Por definición, una PRIMARY KEY (PK) crea en forma automática un índice agrupado (cluster), que se utiliza para mantener el ordenamiento físico de los registros. Por esa razón también es único (un conjunto de datos no puede tener dos ordenamientos físicos diferentes en el disco (¿como se ordenaría una biblioteca de dos formas al mismo tiempo?)

1. No es conveniente "reorganizar" un índice autoincremental porque en esencia es una tarea sin funcionalidad, carente de practicidad y consumidora innecesaria de tiempo de proceso.

2. El renumerar las PRIMARY KEY de un campo incremental no produce ninguna mejora en la optimización de consultas, por lo que hacerlo solamente resulta en tiempo de PC consumido.

3. Renumerar un campo autoincremental, genera un nuevo ordenamiento FÍSICO de los datos (no olvidar que una PK genera un índice cluster), con la consiguiente sobrecarga del microprocesador, porque tiene que reescribir físicamente la tabla cada vez y reconstruir el índice completamente.

4. Tampoco es recomendable bajo ninguna circunstancia renumerar una PK (es el caso en MySQL donde un AUTOINCREMENT es PK por default) si se usa como FK de otras tablas, porque generará inconsistencia de datos entre registros de tablas relacionadas.

5. No se recomienda renumerar si existen datos históricos de otras transacciones, que hacen referencia a otros registros que tenían el mismo número. De hecho, en una tabla de stock, las ID jamás cambian porque el hecho que un producto ya no exista ni se fabrique no quiere decir que no aparezca en registros más antiguos. Pisar un ID sería lo mismo que ponerle a un recién nacido el número de documento de un muerto.

6. Es irrelevante tener espacios de números que ya no se usan, en tanto la numeración sea secuencial e incremental. Perder tiempo en renumerar sólo hace que una lista quede más bonita, pero eso se puede hacer perfectamente en la interfase, donde se visualiza la tabla de datos, o bien se pueden usar variables de usuario para generar numeraciones temporales sin afectar la tabla.

7. Si la duda es quedarse sin números para usar, un ID generado en un campo numérico UNSIGNED tiene estos rangos:

- TINYINT: 0 a 255.
- SMALLINT: 0 a 65.535.
- MEDIUMINT: 0 a 16.777.215
- INT: 0 a 4.294.967.295.
- BIGINT: 0 a 18.446.744.073.709.551.615


En este contexto, si se insertasen 1.000.000 de registros por segundo, se requerirían más de 584.554 años para agotar la numeración de un BIGINT.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 27/06/2011 a las 06:13
  #23 (permalink)  
Antiguo 12/08/2010, 23:50
Avatar de lair  
Fecha de Ingreso: enero-2009
Ubicación: header('Location: Morelia");
Mensajes: 1.052
Antigüedad: 15 años, 3 meses
Puntos: 46
Respuesta: FAQ's de MySQL

Pregunta: ¿Cómo respaldar TODAS mis bases de datos?

mysqldump -u root -p --all-databases > archivo_respaldo.sql


Complemento al aporte de gusma62
Cita:
Iniciado por gusma62 Ver Mensaje
Pregunta: ¿Cómo respaldar mi base de datos?

Una forma es desde la linea de comandos:
Código:
C:\AppServ\MySQL\bin>mysqldump -u root -p base_de_datos > archivo_respaldo.sql
Código:
C:\AppServ\MySQL\bin>mysql -u root -p base_de_datos < archivo_origen.sql
  #24 (permalink)  
Antiguo 05/02/2011, 11:14
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: FAQ's de MySQL

Pregunta: buscar si un rango de fechas comparte uno o más días con otro rango de fechas
búsquedas por eje. sobre reservas de hotel que se hacen entre dos fechas para averiguar con un rango de fechas qué habitaciones estarían ocupadas al menos un día de los del rango de fechas de la reserva. Llamaremos campofechainiciores y campofechafinres a los campos de la tabla reservas, y @fechainiciocons y @fechafincons a las variables que se cargan desde formulario para realizar la búsqueda.
Respuesta:
Código MySQL:
Ver original
  1. SELECT * FROM `reservas`
  2.   WHERE @fechainiciocons<=campofechafinres AND @fechafincons >= campofechainiciores

La lógica es la siguiente:si la primera fecha es anterior o igual a la fecha final de reserva y a la vez la fecha final es mayor o igual que la fecha de inicio de reserva, hay al menos un día en común. Nos lo hizo ver Avatar810 en un post
http://www.forosdelweb.com/f86/selec...fechas-693114/
  #25 (permalink)  
Antiguo 13/07/2011, 00:32
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: FAQ's de MySQL

Pregunta: ¿"SET CHARACTER SET utf8" es necesario cuando estoy trabajando con data codificada en UTF8?
Respuesta:
Información tomada de http://stackoverflow.com/questions/1...utf8-necessary
Cita:
Usar SET CHARACTER SET utf8 después de usar SET NAMES utf8 realmente restablece el character_set_connection y collation_connection a @@character_set_database y @@collation_database respectivamente.

El manual indica que

SET NAMES x es equivalente a

SET character_set_client = x;
SET character_set_results= x;
SET character_set_connection = x;

y SET CHARACTER SET X es equivalente a

SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;
mientras que SET collation_connection = x internamente tambien ejecuta SET character_set_connection = <<character_set_of_collation_x>> y SET character_set_connection = x internamente ejecuta tambien SET collation_connection = <<default_collation_of_character_set_x.

Así que, esencialmente estás restableciendo character_set_connection a @@character_set_database y collation_connection a @@collation_database. El manual explica el uso de estas variables:

Cita:
¿ Qué conjunto de caracteres debería usar el servidor para traducir una consulta tras recibirla?

Para esto, el servidor usa character_set_connection y collation_connection. Esto convierte las consultas enviadas por el cliente de character_set_client a character_set_connection (excepto para cadenas de caracteres literales que tienen un introductor como _latin1 o _utf8). collation_connection es importante para comparaciones de cadenas de caracteres literales. Para comparaciones de cadenas de caracteres con valores de columnas no importa, ya que las columnas tienen una precedencia mayor en las colaciones.
Para resumir, el procedimiento de MySQL codificación / transcodificación que utiliza para procesar la consulta y sus resultados es una cosa-multi-paso:

1. MySQL trata la consulta entrante como codificado en character_set_client.
2. MySQL transcodifica la declaración de character_set_client en character_set_connection cuando se comparan los valores de la cadena de valores de columna MySQL transcodifica el valor de la cadena de character_set_connection en el chracter conjunto de la columna de la base de datos y utiliza la intercalación de columna para hacer la comparación y ordenación.
3. MySQL acumula el conjunto de resultados codificados en character_set_results (esto incluye datos de los resultados, así como metadatos resultantes como nombres de columna y así sucesivamente)
Por lo tanto, podría ser el caso de que un conjunto de caracteres Utf8 no sería suficiente para proporcionar completo de UTF-8. Piense en una base de datos de carácter conjunto predeterminado de latin1 y las columnas definidas con utf8-charset y seguir los pasos descritos anteriormente. Como latin1 no puede cubrir todos los caracteres que UTF-8 puede cubrir, puede perder información de carácter en el paso 3.

Paso 3: Teniendo en cuenta que la consulta está codificado en UTF-8 y contiene caracteres que no se puede representar con latin1, estos personajes se pierden en la transcodificación de utf8 a latin1 (la base de datos por defecto del juego de caracteres) de no poder hacer su consulta.

Así que creo que es seguro decir que SET NAMES ... es la forma correcta de manejar los problemas del conjunto de caracteres. A pesar de que podría añadir que la creación de las variables del servidor MySQL correctamente (todas las variables reuired se puede configurar de forma estática en el my.cnf) le libera de la sobrecarga de rendimiento de la consulta adicional que se requiere en cada conexión.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #26 (permalink)  
Antiguo 29/05/2012, 04:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FAQ's de MySQL

Pregunta: ¿Cómo calculo la distancia entre dos puntos geográficos (Lat/Long)?
Respuesta: Trigonometría aplicada:
Código MySQL:
Ver original
  1. CREATE FUNCTION `FN_DISTANCIA`(
  2.     LAT_P1 FLOAT,
  3.     LNG_P1 FLOAT,
  4.     LAT_P2 FLOAT,
  5.     LNG_P2 FLOAT)
  6.   RETURN ((6378 * 2 * ASIN(SQRT(POWER(SIN((LAT_P1 - LAT_P2) * PI()/180 / 2), 2) + COS(LAT_P1 * PI()/180) *  COS(LAT_P2 * PI()/180) *  POWER(SIN((LNG_P1 -LNG_P2) * PI()/180 / 2), 2)))));
Devuelve la cantidad de kilómetros entre dos coordenadas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 25/06/2014 a las 05:34
  #27 (permalink)  
Antiguo 11/06/2012, 19:25
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FAQ's de MySQL

Pregunta: ¿Cómo recorrer iterativamente el resultado de una consulta dentro de un procedimiento almacenado?
Respuesta: Cursor, Handlers, variables locales.

El tema se resuelve por medio de:
1. Trazado de la lectura por medio de CURSOR y FETCH.
2. Manejo de HANDLER, para controlar los eventos de tabla.
3. Acciones repetitivas por medio de funciones de control de flujo: REPEAT ... END REPEAT y LOOP ... END LOOP, etc.

El manual de referencia tiene un capítulo entero dedicado al tema, pero lo esencial se puede resumir así:

1. Primero tienes que declarar todas las variables que vayas a usar para contener los datos de cada registro que leas. es necesario porque no puedes leer el registro en sí, sino que debes volcar los datos seleccionados dentro de variables y manipularlos en esas variables.
Esto es lo primero a definir, apenas después del BEGIN del store procedure.

2. Luego tienes que definir el CURSOR. Podemos decir que un cursor en un puntero que contiene la posición del registro de la consulta a una tabla según una sentencia de SELECT asociada al mismo. La sintaxis habitual es una sentencia select cualquiera, por ejemplo:

Código MySQL:
Ver original
  1. DECLARE traza1 CURSOR FOR
  2. SELECT  A, B, C, D, E
  3. FROM tabla1
  4. WHERE A = 23;
3. Luego tienes que ser capaz de saber cuándo has llegado al fin de la lectura de la tabla. Eso sucede cuando el puntero del cursor se intenta mover más allá del último regitro. En ese momento se produce un SQLSTATE cuyo valor indica el tipo de problema. El número de cada SQLSTATE está asociado a un error en la base de datos y están listados en un capítulo aparte.
El handler define no solamente la captura del error sino qué acción se realizará (nada, salir, deshacer) y la sintaxis en este caso será:

Código MySQL:
Ver original
  1. DECLARE CONTINUE HANDLER FOR SQLSTATE '20000' SET accion = 1;

La variable accion es también una variable que debes definir previamente y darle el valor cero (0):

Código MySQL:
Ver original
  1. DECLARE accion INT DEFAULT 0;

4. Finalmente, puedes escribir el cuerpo del procedimiento, hasta el momento que ya tengas la tabla temporal. Obviamente el cursor es un select dirigido a ella.
Lo primero es abrir el cursor, luego iniciar el ciclo de lectura y finalmente cerrarlo.
Código MySQL:
Ver original
  1. OPEN traza1;
  2.    FETCH traza1 INTO A1, B1, C1, D1, E1;
  3. ...
  4. Cuerpo de los procesos a realizar con los valores
  5. ...
  6. UNTIL accion END REPEAT;
  7.  
  8. CLOSE traza1;
FETCH lo que hace es tomar la resultante de la consulta del cursor, registro a registro y volcarla a las variables. Obviamente la cantidad de variables debe ser igual a la cantidad de campos leídos en la consulta, así como también sus tipos de datos deben ser de la misma clase.
Cuando llega al final de la tabla resultado, e intenta leer de más, se produce el SQLSTATE 20000, la variable se pone en 1, y como es la condición de salida, sale del loop.
Dos últimos detalles:
1. El proceso es siempre de lectura hacia adelante. No puedes retroceder. En todo caso deberás abrir de nuevo el cursor (nueva ejecución), y rehacer el barrido.
2. No se pueden definir variables en el SP con posterioridad al CURSOR, ni se puede definir un HANDLER antes del CURSOR. Te daría un error de compilación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 01/03/2016 a las 08:25
  #28 (permalink)  
Antiguo 26/06/2012, 15:11
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: FAQ's de MySQL

APORTE de @leonardo_josue: Página de ejemplos de consultas.

Link: Common MySQL Queries
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 34 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 16:20.