BENCHMARK(
count
,expr
)
La función BENCHMARK()
ejecuta la
expresión expr
repetidamente
count
veces. Puede usarse para
ver lo rápido que MySQL procesa la expresión. El valor
resultado siempre es 0
. El uso pretendido
es desde dentro del cliente mysql, que
reporte tiempos de ejecución de consultas:
mysql> SELECT BENCHMARK(1000000,ENCODE('hello','goodbye')); +----------------------------------------------+ | BENCHMARK(1000000,ENCODE('hello','goodbye')) | +----------------------------------------------+ | 0 | +----------------------------------------------+ 1 row in set (4.74 sec)
El tiempo reportado es el tiempo transcurrido en el cliente
final no el tiempo de CPU en el servidor. Se recomienda
ejecutar BENCHMARK()
varias veces, y
interpretar el resultado teniendo en cuenta la carga de la
máquina servidor.
CHARSET(
str
)
Retorna el conjunto de caracteres el argumento cadena.
mysql> SELECT CHARSET('abc'); -> 'latin1' mysql> SELECT CHARSET(CONVERT('abc' USING utf8)); -> 'utf8' mysql> SELECT CHARSET(USER()); -> 'utf8'
COERCIBILITY(
str
)
Retorna la coerzabilidad de la colación del argumento.
mysql> SELECT COERCIBILITY('abc' COLLATE latin1_swedish_ci); -> 0 mysql> SELECT COERCIBILITY(USER()); -> 3 mysql> SELECT COERCIBILITY('abc'); -> 4
El valor de retorno tiene los siguientes significados:
Coerzabilidad | Significado | Ejemplo |
0 |
Colación explícita | Valor con la cláusula COLLATE
|
1 |
Sin colación | Concatenación de cadenas con distintas colaciones |
2 |
Colación implícita | Valor de columna |
3 |
Constante de sistema | Valor de retorno USER()
|
4 |
Coercible | Cadena literal |
5 |
Ignorable |
NULL o una expresión derivada de
NULL
|
Antes de MySQL 5.0.3, los valores de retorno se muestran
como sigue, y las funciones tales como
USER()
tienen una coerzabilidad de 2:
Coerzabilidad | Significado | Ejemplo |
0 |
Colación explícita | Valor con la cláusula COLLATE
|
1 |
Sin colación | Concatenación de cadenas con distintas colaciones |
2 |
Colación implícita | Valor de columna |
3 |
Coercible | Cadena literal |
Los valores menores tienen precedencia mayor.
COLLATION(
str
)
Retorna la colación para el conjunto de caracteres de la cadena dada.
mysql> SELECT COLLATION('abc'); -> 'latin1_swedish_ci' mysql> SELECT COLLATION(_utf8'abc'); -> 'utf8_general_ci'
CONNECTION_ID()
Retorna el ID de la conexión (ID del thread) para la conexión. Cada conexión tiene su propio y único ID.
mysql> SELECT CONNECTION_ID(); -> 23786
CURRENT_USER()
Retorna la combinación de nombre de usuario y de equipo que
tiene la sesión actual. Este valor se corresponde con la
cuenta MySQL que determina sus privilegios de aceso. Puede
ser distinto al valor de USER()
.
mysql> SELECT USER(); -> 'davida@localhost' mysql> SELECT * FROM mysql.user; ERROR 1044: Access denied for user ''@'localhost' to database 'mysql' mysql> SELECT CURRENT_USER(); -> '@localhost'
El ejemplo ilustra que aunque el cliente especica un nombre
de usuario de davida
(como se indica por
el valor de la función USER()
), el
servidor autentica al cliente usando una cuenta de usuario
anónimo (como se ve por la parte de usuario vacía del
valor CURRENT_USER()
). Una forma en que
esto puede ocurrir es que no haya cuenta listada en las
cuentas de permisos para davida
.
En MySQL 5.0, la cadena retornada por
CURRENT_USER()
usa el conjunto de
caracteres utf8
.
DATABASE()
Retorna el nombre de base de datos por defecto (actual). En
MySQL 5.0, la cadena tiene el conjunto de caracteres
utf8
.
mysql> SELECT DATABASE(); -> 'test'
No hay base de datos por defecto,
DATABASE()
retorna
NULL
.
FOUND_ROWS()
Un comando SELECT
puede incluir una
cláusula LIMIT
para restringir el
número de registros que el servidor retorna al cliente. En
algunos casos, es deseable saber cuántos registos habría
retornado el comando sin LIMIT
, pero sin
volver a lanzar el comando. Para obtener este conteo de
registros, incluya la opción
SQL_CALC_FOUND_ROWS
en el comando
SELECT
, luego invoque
FOUND_ROWS()
:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
-> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
El segundo SELECT
retorna un número
indicando cuantos registros habría retornado el primer
SELECT
sin la cláusula
LIMIT
. (Si el comando precendente no
incluye la opción SQL_CALC_FOUND_ROWS
,
FOUND_ROWS()
puede retornar un resultado
distinto cuando se usa LIMIT
y cuando
no.)
Tenga en cuenta que si usa SELECT
SQL_CALC_FOUND_ROWS
, MySQL debe calcular cuántos
registros hay en el conjunto de resultdos completo. Sin
embargo, esto es más rápido que ejecutar la consulta de
nuevo sin LIMIT
, ya que el conjunto de
resultados no necesita ser enviado al cliente.
SQL_CALC_FOUND_ROWS
y
FOUND_ROWS()
pueden ser útiles en
situaciones donde puede querer restringir el número de
registros que retorna una consulta, pero también determinar
el número de registros en el conjunto de resultados entero
sin ejecutar la consulta de nuevo. Un ejemplo es el script
Web que presenta una salida paginada conteniendo enlaces a
las páginas que muestran otras secciones de un resultado de
búsqueda. Usando FOUND_ROWS()
puede
determinar cuántas páginas necesita para el resto de
resultados.
El uso deSQL_CALC_FOUND_ROWS
y
FOUND_ROWS()
es más complejo para
consultas UNION
que para comandos
SELECT
simples, ya que
LIMIT
puede ocurrir en varios lugares en
una UNION
. Puede aplicarse a comandos
SELECT
individuales en la
UNION
, o global en el resultado de
UNION
como conjunto.
La intención de SQL_CALC_FOUND_ROWS
para
UNION
es que debe retornar el número de
registros que se retornarían sin un
LIMIT
globar. Las condiciones para uso de
SQL_CALC_FOUND_ROWS
con
UNION
son:
La palabra clave SQL_CALC_FOUND_ROWS
debe aparecer en el primer SELECT
de
la UNION
.
El valor de FOUND_ROWS()
es exacto
sólo si se usa UNION ALL
. Si se usa
UNION
sin ALL
, se
eliminan duplicados y el valor de
FOUND_ROWS()
es sólo aproximado.
Si no hay LIMIT
en
UNION
, se ignora
SQL_CALC_FOUND_ROWS
y retorna el
número de registros en la tabla temporal que se crea
para procesar UNION
.
LAST_INSERT_ID()
,
LAST_INSERT_ID(
expr
)
Retorna el último valor generado automáticamente que se
insertó en una columna AUTO_INCREMENT
.
mysql> SELECT LAST_INSERT_ID(); -> 195
El último ID generado se mantiene en el servidor para cada
conexión. Esto significa que el valor de la función
retorna a cada cliente el valor
AUTO_INCREMENT
más reciente generado por
ese cliente. Este valor no puede ser afectado por otros
clientes, incluso si generan valores
AUTO_INCREMENT
ellos mismos. Este
comportamiento asegura que reciba sus propios IDs sin tener
en cuenta la actividad de otros clientes y sin la necesidad
de bloqueos o transacciones.
El valor de LAST_INSERT_ID()
no cambia si
actualiza la columna AUTO_INCREMENT
de un
registro con un valor no mágico (esto es, un valor que no
es NULL
ni 0
).
Si inserta varios registros a la vez con un comando de
inserción LAST_INSERT_ID()
retorna el
valor del primer registro insertado. La razón para esto es
hacer posible reproducir fácilmente el mismo comando
INSERT
contra otro servidor.
Si usa INSERT IGNORE
y el registro se
ignora, el contador AUTO_INCREMENT
no se
incrementa y LAST_INSERT_ID()
retorna 0,
lo que refleja que no se ha insertado ningún registro.
(Antes de MySQL 4.1, AUTO_INCREMENT
el
contador se incrementa y LAST_INSERT_ID()
retorna el nuevo valor.)
Si se da expr
como argumento para
LAST_INSERT_ID()
, el valor del argumento
se retorna por la función y se recuerda como el siguiente
valor a ser retornado por
LAST_INSERT_ID()
. Esto puede usarse para
simular secuencias:
Cree una tabla para guardar el contador de secuencia y inicializarlo:
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
Use la tabla para generar números de secuncia como aquí:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1); mysql> SELECT LAST_INSERT_ID();
El comando UPDATE
incrementa el
contador de secuencia y causa que la siguiente llamada a
LAST_INSERT_ID()
retorne el valor
actualizado. El comando SELECT
recibe
ese valor. La función de la API C
mysql_insert_id()
puede usarse para
obtener el valor . Consulte
Sección 24.2.3.34, “mysql_insert_id()
”.
Puede generar secuencias sin llamar a
LAST_INSERT_ID()
, pero la utilidad de
usar esta función de esta forma es que el valor ID se
mantiene en el servidor como el último valor generado
automáticamente. Es válido para multi usuarios porque
varios clientes pueden realizar el comando
UPDATE
y obtener su propio valor de
secuencia con el comando SELECT
(o
mysql_insert_id()
), sin afectar o ser
afectado por otros clientes que generen sus propios valores
de secuencia.
Tenga en cuenta que mysql_insert_id()
sólo se actualiza tras los comandos
INSERT
y UPDATE
, así
que no puede usar la función de la API C para recibir el
valor de
LAST_INSERT_ID(
tras ejecutar otros comandos SQL como
expr
)SELECT
o SET
.
ROW_COUNT()
ROW_COUNT()
retorna el número de
registros actualizados, insertados o borrados por el comando
precedente. Esto es lo mismo que el número de registros que
muestra el cliente mysql y el valor de la
función de la API C
mysql_affected_rows()
.
mysql> INSERT INTO t VALUES(1),(2),(3); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 3 | +-------------+ 1 row in set (0.00 sec) mysql> DELETE FROM t WHERE i IN(1,2); Query OK, 2 rows affected (0.00 sec) mysql> SELECT ROW_COUNT(); +-------------+ | ROW_COUNT() | +-------------+ | 2 | +-------------+ 1 row in set (0.00 sec)
ROW_COUNT()
se añadió en MySQL 5.0.1.
SESSION_USER()
SESSION_USER()
es sinónimo de
USER()
.
SYSTEM_USER()
SYSTEM_USER()
es sinónimo de
USER()
.
USER()
Retorna el nombre de usuario y de equipo de MySQL actual.
mysql> SELECT USER(); -> 'davida@localhost'
El valor indica el nombre de usuario especificado al
conectar con el servidor, y el equipo cliente desde el que
se está conectando. El valor puede ser distinto del de
CURRENT_USER()
.
Puede extraer la parte de nombre de usuario así:
mysql> SELECT SUBSTRING_INDEX(USER(),'@',1); -> 'davida'
En MySQL 5.0, USER()
retorna un valor en
el conjunto de caracteres utf8
, así que
debe asegurarse que la literal '@'
se
interpreta en el conjunto de caracteres:
mysql> SELECT SUBSTRING_INDEX(USER(),_utf8'@',1); -> 'davida'
VERSION()
Retorna una cadena que indica la versión del servidor
MySQL. La cadena usa el conjunto de caracteres
utf8
.
mysql> SELECT VERSION(); -> '5.0.9-standard'
Tenga en cuenta que si su cadena de versión acaba con
-log
significa que el logueo está
activado.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.