Archive for the ‘Bases de Dades / Databases’ Category

Problemes de Collation a MySql

dissabte, novembre 6th, 2010

Tot sovint l’ús de diferent collation entre la connexió i la configuració de la base de dades i/o les taules causen un error de collation.

A partir de MySql 4.1.8 podem comprovar quin collation s’està fent servir amb una sentència com aquesta:

SELECT COLLATION(USER()), COLLATION('@');

Podem definir el collation amb el que volem que es defineixin les variables amb SET NAMES:

SET CHARACTER SET 'UTF8';
SET NAMES 'utf8' COLLATE 'utf8_general_ci';

A partir d’aquí les variables de text ja no donaran conflicte amb la base de dades ut8_general_ci puix que hem indicat que es treballi amb aquest format.

Per exemple:

SET @s_email='email@codic.cat';
SELECT * FROM correus WHERE correu_usuari=@s_email;

Ja no donaria un error com:
#1267 – Illegal mix of collations (latin1_swedish_ci,IMPLICIT)
and (utf8_general_ci,COERCIBLE) for operation ‘=’

Més informació: http://dev.mysql.com/doc/refman/4.1/en/charset-collation-charset.html

Alliberat MyDebugger 1.2.1.1579

dilluns, octubre 18th, 2010

El proppassat 8 d’Octubre fou alliberada la versió 1.2.1.1579 d’aquest debugger de procediments emmagatzemats (stored procedures) i funcions de MySql.

El podeu descarregar i provar durant 30 dies de manera gratuïta al seu web: http://mydebugger.com/

Crear un procediment emmagatzemat en MySql que retorni paràmetres

Dimarts, agost 3rd, 2010

Els procediments emmagatzemats (stored procedures) poden tenir paràmetres d’entrada IN i paràmetres de sortida OUT.

Per a definir aquest procediment empraríem un codi SQL com ara aquest:

CREATE PROCEDURE `codic_envia_mail`(IN `S_PLANTILLA` VARCHAR(50), IN `I_USUARI` INT, IN `S_TIPUS` VARCHAR(5), IN `I_CODI` INT, IN `S_PARAM1` VARCHAR(50), IN `S_PARAM2` VARCHAR(50), IN `S_PARAM3` VARCHAR(50), OUT `I_MAILPK` INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN

Els paràmetres d’entrada són les dades que li passem al procediment, i els paràmetres de sortida són els que ens permeten recuperar amb una altra comanda SELECT les dades que ha preparat el procediment.

En la imatge superior es passen 7 paràmetres d’entrada i un de sortida @I_MAILPK.

A nivell de codi PHP i ZendDb cridaríem el procediment i recuperaríem la variable de sortida amb un codi similar a aquest:

$s_variable_de_sortida = '@I_MAILPK';
try {
    $o_sel=dbHandler::getAdapter()
    ->query("CALL codic_envia_plantilla('{$s_plantilla}', {$i_usuari}, '{$s_tipus}', {$i_codi}, '{$s_parametre1}', '{$s_parametre2}', '{$s_parametre3}', {$s_variable_de_sortida})");
    // Recuperar la variable de sortida. Pe: @I_MAILPK
    $o_sel2=dbHandler::getAdapter()
        ->query("SELECT {$s_variable_de_sortida}");
    // Nota: Encara millor si feu servir la substitució amb ? ja que llavors és ZendDb qui filtra possibles caracters problemàtics
    $o_sql = "CALL codic_envia_plantilla(?, ?, ?, ?, ?, ?, ?, {$s_variable_de_sortida})";
    $o_sel=dbHandler::getAdapter()
	-->query($s_sql, array($s_plantilla, $i_usuari, $s_tipus, $i_codi, $s_parametre1, $s_parametre2, $s_parametre3));

    // Recuperar la variable de sortida. Pe: @I_MAILPK
    $o_sel2=dbHandler::getAdapter()
        ->query("SELECT {$s_variable_de_sortida}");

    if ($o_sel2->rowCount() > 0){
        $st_dades = $o_sel2->fetch();
        $i_resultat = $st_dades[$s_variable_de_sortida];
        return true;    // S'ha executat bé, sortim de la funció retornant true
    }
    else
    {
        // El procediment no ha retornat cap valor dins la variable
        // així que no ha anat bé
        return false;
    }
} catch (Exception $e) {
    // Hi ha hagut una excepció (Exception)
    throw new Exception('Excepció enviant el correu: '.$e->getMessage());
}

Els prefixes $s_ $i_ ens indiquen quin tipus de variable és:

$s_ string, cadena de caracters
$i_ integer, número sencer
$b_ boolean, valor booleà true/false >0 o 0/null/blanc
$st_ structure, estructura, com ara un array
$o_ object, objecte per exemple de base de dades

La variable de sortida a MySql porta l’ensaïmada o arrova davant.
Podem utilitzar altres notacions com $r_ per als arrays, etc.. però és important de cara a la llegibilitat del nostre codi sempre emprar la mateixa notació.
Emprar aquests prefixes ens estalviarà errors de programació, per exemple sumar cadenes amb números.

Un exemple de programació sense ZendDb i dos paràmetres de sortida:

mysql_query = "call sp_GetUsers('ProjectName',@ErrorNumber, @ErrorMessage)";
$result = mysql_query('select @ErrorNumber, @ErrorMessage');
$row = mysql_fetch_assoc($result);
print_r($row);

Com veieu sense indicar els prefixes resulta força menys intuitiu.

Per a més exemple de crides IN/OUT sense ZendDb podeu veure:

http://www.herongyang.com/jdbc/MySQL-CallableStatement-Procedure-Parameters.html

http://www.tek-tips.com/viewthread.cfm?qid=1441148&page=10

Solució error MySql 1064 creant un procediment emmagatzemat (stored procedure)

divendres, juny 25th, 2010

L’error 1064 quan creem un procediment emmagatzemat és bastant molest i difícil de descobrir-ne el perquè puix que apunta la primera línia de codi, i aquesta no té cap error.

/* SQL Error (1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ” at line 8 */

Aquest error és degut simplement a que MySql considera que on hi ha el punt i coma ; acaba la sentència.

Per tant es fa un embolic creient que acaba el procediment emmagatzemat (stored procedure).

La solució és tan simple com emprar DELIMITER.

Emprant davant de tot:

DELIMITER //

i al final:

END//
DELIMITER ;

(pareu atenció a que no hi hagi un espai entre END i //)

S’acaba el problema.

Alliberat HeidiSql 5.1.0.3372

divendres, juny 4th, 2010

Ahir es va alliberar la nova versió de HeidiSQL, la 5.1.0.3372.

Aquesta nova versió soluciona alguns errors (bugs) i presenta noves funcionalitats.

Podem editar valors de la graella de resultats d’una select, i també podem executar diverses consultes des del mateix quadre d’sql de cop, i s’obren cadascuna en una pestanya (tab).

Properament això s’implementarà també per als procediments emmagatzemats (stored procedures).

Una altra funcionalitat interessant és que a baix s’ofereixen unes quantes estadístiques de rendiment del servidor.

Truc: Actualitzar els collations de totes les taules d’una base de dades MySql

dissabte, maig 29th, 2010

Un dia em vaig trobar amb una base de dades MySql que tenia mal fixats els collations (transformacions per a tipus de caracters).

Canviar-ho camp per camp, taula per taula, representava una feina molt feixuga.

Vaig trobar aquesta eina gratuita, en PHP, pensada per a fer-la anar des del nostra servidor web que fa el fet:

phoca-changing-collation-tool

Des d’allí hi podeu descarregar un arxiu zip que conté el codi PHP pensat per a executar-lo des d’un servidor web.

Tot i això res no impediria pas de fer servir el mateix programa des de línia de comandes amb l’ intèrpret PHP amb unes petitones modificacions.

Assumint el seu ús mitjançant un servidor web, si teniu moltes taules haureu de canviar el màxim temps d’execució de PHP puix que la operació durà temps.

Un avantatge del codi obert és que pots saber exactament què fa i evitar sorpreses desagradables.

Us adjunto el codi php de la eina per si mai deixés d’estar disponible:

<?PHP
/*
* @tool	Phoca Changing Collation
* @Changing collation of database, tables and columns
* @Run this script only at your own risk. If you have a big database
* @you need to change the script execution time in your php
* @copyright (C) Jan Pavelka www.phoca.cz (http://www.phoca.cz)
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL
* @based on script from http://php.vrana.cz/ - Author - Jakub Vrana
* @license http://creativecommons.org/licenses/by/2.5/
* @Creative Commons Attribution 2.5 Generic
*/
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="robots" content="index, follow" />
<meta name="keywords" content="phoca, server unzip" />
<meta name="description" content="Phoca Server Unzip tool" />
<meta name="generator" content="www.phoca.cz" />
<title>Phoca Server Unzip tool</title>
<style type="text/css">
    body {font-family: Arial, sans-serif; font-size: 10px; color: #000000 ;}
    h1 a {color:#006699;text-decoration:none;}
    #info {position: relative;float:right; top:10px; right:10px; text-align:right;margin-bottom:10px;}
    .error {font-weight:bold;color:#c10000}
    .warning {font-weight:bold;color:#ff8102}
    .success {font-weight:bold;color:#008040}
    .window {position:relative;top:10px;left:10px;width:95%;padding:5px;height:300px; overflow:auto;border:1px solid #000;background:#fbfbfb;clear:both;}
</style>
</head>
<body>
<div id="info">
    <img src="assets/phoca-logo.png" alt="Phoca" /><br />
    <a href="http://www.phoca.cz/">www.phoca.cz</a><br />
    <a href="http://www.phoca.cz/forum">www.phoca.cz/forum</a>
</div>
<h1><a href="index.php">Phoca Changing Collation tool</a></h1>
<?php
    function start_db($mysqlhost,$mysqldatabase, $mysqluser, $mysqlpass)
    {
        global $conn;
        $conn = mysql_connect($mysqlhost, $mysqluser, $mysqlpass);
        if (!$conn)
        {
           echo '<a href="index.php">Back to the main site</a><br />';
           die('Database error.');
        }
        $select = mysql_select_db($mysqldatabase, $conn);
        if (!$select)
        {
           echo '<a href="index.php" >Back to the main site</a><br />';
           die('Database error.');
        }
    }
    function end_db ($conn)
    {
        mysql_close($conn);
    }
if (   isset($_POST['host'])
    && isset($_POST['user'])
    && isset($_POST['pass'])
    && isset($_POST['name'])
    && isset($_POST['col']))
{
    $mysqlhost 		= $_POST['host'];
    $mysqluser 		= $_POST['user'];
    $mysqlpass 		= $_POST['pass'];
    $mysqldatabase 	= $_POST['name'];
    $collation 		= $_POST['col'];
    // Change the time -------------------------------------
    $changedMaxExecTime		= 0;
    $standardMaxExecTime 	= ini_get('max_execution_time');
    if ($standardMaxExecTime != 0  && $standardMaxExecTime < 120) {
        set_time_limit(120);
        $changedMaxExecTime	= 1;
    }
    // -----------------------------------------------------
    start_db($mysqlhost,$mysqldatabase, $mysqluser, $mysqlpass);
    //Start code from http://php.vrana.cz/ - Author - Jakub Vrana
    function mysql_convert($query) {
        echo '<div>' . $query . ' ... <span style="color:#26d92b;">OK</span></div>';
    return mysql_query($query);
    }
    echo '<div></div>';
    echo '<div>';
    mysql_convert("ALTER DATABASE $mysqldatabase COLLATE $collation");
    $result = mysql_query("SHOW TABLES");
    while ($row = mysql_fetch_row($result)) {
        mysql_convert("ALTER TABLE $row[0] COLLATE $collation");
        $result1 = mysql_query("SHOW COLUMNS FROM $row[0]");
        while ($row1 = mysql_fetch_assoc($result1)) {
            if (preg_match('~char|text|enum|set~', $row1["Type"])) {
                mysql_convert("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] CHARACTER SET binary");
                mysql_convert("ALTER TABLE $row[0] MODIFY $row1[Field] $row1[Type] COLLATE $collation" . ($row1["Null"] ? "" : " NOT NULL") . ($row1["Default"] && $row1["Default"] != "NULL" ? " DEFAULT '$row1[Default]'" : ""));
            }
        }
    }
    echo '</div>';
    mysql_free_result($result);
    //End code from http://php.vrana.cz/ - Author - Jakub Vrana
    end_db($conn);
    echo '<p>&nbsp;</p><a href="index.php">Back to the main page</a>';
    // Set back the time --------------------
    if ($changedMaxExecTime == 1) {
        set_time_limit($standardMaxExecTime);
    }
    // --------------------------------------
}
else
{
    ?>
    <h2>Change database collation (DATABASE, TABLES, COLUMNS)</h2>
    <form action="index.php" method="post">
    <table>
    <tr><td>Database Host</td><td><input type="text" name="host" value="localhost" /></td></tr>
    <tr><td>Database User</td><td><input type="text" name="user" value="username" /></td></tr>
    <tr><td>Database Password</td><td><input type="password" name="pass" value="password" /></td></tr>
    <tr><td>Database Name</td><td><input type="text" name="name" value="database name" /></td></tr>
    <tr><td>Database Collation</td><td><input type="text" name="col" value="utf8_general_ci" /></td></tr>
    <tr><td></td><td><input type="submit" value="Submit" /></td></tr>
    </table>
    </form>
    <?php
}
?>
</body>
</html>

Alliberat HeidiSql 5.1

dissabte, abril 17th, 2010

El proppassat dia 15 s’alliberà la versió 5.1 de HeidiSQL.

HeidiSQL és un programari lliure que permet treballar amb servidors de bases de dades MySql.

Aquesta versió, estable, soluciona alguns problemes (bugs) i incorpora noves funcionalitats.

La que més m’agrada és que quan s’executa un procediment emmagatzemat (stored procedure) des del menú contextual, el programa ens demanarà en una finestra els paràmetres per al procediment.

El podeu descarregar de la seva web:

http://www.heidisql.com/

Alliberat Heidi Sql 5.0

dilluns, març 29th, 2010

El proppassat dia 26 s’alliberà d’aquest potent  gestor gratuït de bases de dades MySql.

És similar al conegut TOAD per a Oracle, però per a MySQL,  nogensmenys peta molt menys que toad i és programari lliure (open source).

Està disponible per a Windows, però corre perfectament sota WINE (Windows Emulator).

Ahir no vaig comentar que no es tracta de la versió final sinó d’una beta (nightly build), nogensmenys la versió anterior beta només m’ha fallat un cop.

El podeu descarregar des de la seva plana web:

http://www.heidisql.com/

WAMP

dijous, desembre 24th, 2009

WAMP vol dir:

Windows

Apache

MySql

PHP.

És habitual l’expressió LAMP:

Linux

Apache

MySql

PHP.

La gent de wampserver.com van desenvolupar un WAMP:

Apache + MySql +  PHP per a Windows.

Bàsicament han creat un executable que instal·la Apache, Php, i MySql tot llest per a començar a programar i que permet configurar la majoria de coses amb un clic.

Les directives de PHP.INI o d’Apache (httpd.conf) es poden modificar amb una simple pulsació del botó del ratolí, i llavors el programari modifica els fitxers de configuració.

Així per exemple per a activar en PHP que permeti usar <? i no només <?php, enlloc de modificar l’arxiu PHP.INI i acativar la directiva short open tag, fem clic a la opció pertinent, wamp fa que s’actualitzi la configuració, i al cap de 2 segons en el nostre entorn ja permet executar codis PHP com <?=”Hola Catalunya”?>.

Crear àlies al servidor web es fa també des del ratolí i és terriblement fàcil.

Una altra de les gràcies és que permet disposar de diverses versions d’Apache, de PHP o de MySql i de bescanviar quina s’està executant amb un clic.

Nogensmenys per a fer això s’ha d’instal·lar uns complements.

I per a acabar-ho d’adobar incorpora el PHPMyAdmin, que és un administrador web per a MySql, per a poder crear les taules, índexs, afegir usuaris, permisos, etc… des de la mateixa eina.

No podia faltar la opció phpinfo(). ;-)

Jo acostumo a desenvolupar en PHP contra Linux, o bé contra Windows, però en configuracions on tot és instal·lat manualment i els arxius s’han de modificar a mà: el servidor Web, MySql, i el PHP…

I haig de dir que amb wampserver va ser descarregar-lo i començar a programar en qüestió de segons.

El fet de poder parar tots els serveis per a que no consumeixin memòria ni CPU mentre no els fem servir, i poder-los reiniciar en segons amb un clic, també és d’agrair.

Actualitzacions de seguretat de Windows 2003 Server (molt urgent)

Dimarts, octubre 13th, 2009

codic-cat-2009-10-13-windows2003-32bitMicrosoft ha presentat avui tot un seguit d’actualitzacions de seguretat (patch o pedaços) realment crítics per al seu programari servidor Windows 2003 server.

Jo he vist una servidor hackejat recentment i estic segur que s’han aprofitat d’alguna d’aquestes vulnerabilitats.

De fet microsoft ja admet a la descripció de les actualitzacions que un atacant pot guanyar el control del servidor.

De moment he vist les actualitzacions per a windows server 32 bit en anglès, però sospito que les versions de 64 bit també deuen estar afectades i per descomptat les versions localitzades en qualsevol altre idioma.

De fet la llista d’actualitzacions de seguretat publicades avui és extensa.

Inclou errors de Windows 2003 Server, de Sql Server 2005 SP 3, de .NET Framework 1.1 SP1, .NET framework 2.0 SP2, Internet Explorer 8, i Outlook 2003.

La llista d’actualitzacions i el l’enllaç a microsoft per a descarregar-les manualment:

http://go.microsoft.com/fwlink/?LinkId=125438

http://go.microsoft.com/fwlink/?LinkID=163830

http://go.microsoft.com/fwlink/?LinkId=163913

http://go.microsoft.com/fwlink/?LinkId=162442

http://go.microsoft.com/fwlink/?LinkID=161342

http://go.microsoft.com/fwlink/?LinkId=164004

http://go.microsoft.com/fwlink/?LinkID=163832

Microsoft .NET Framework 1.1 Service Pack 1 Security Update for Windows Server 2003 x86 and Windows Server 2003 R2 x86 (KB953298)
Date last published: 10/13/2009

http://go.microsoft.com/fwlink/?LinkID=127836

Microsoft .NET Framework 2.0 Service Pack 2 Security Update for Windows 2000, Windows Server 2003, and Windows XP (KB974417)
Date last published: 10/13/2009

http://go.microsoft.com/fwlink/?LinkId=161067

Cumulative Security Update for Internet Explorer 8 for Windows Server 2003 (KB974455)

http://go.microsoft.com/fwlink/?LinkId=163979

Cumulative Security Update for ActiveX Killbits for Windows Server 2003 (KB973525)

http://go.microsoft.com/fwlink/?LinkId=158202

Security Update for Windows Server 2003 (KB975467)
Date last published: 10/13/2009

http://support.microsoft.com/kb/975467

Security Update for Microsoft Office 2003 (KB974554)

http://support.microsoft.com/kb/974554

Security Update for Microsoft Office Outlook 2003 (KB973705)
Date last published: 10/13/2009

http://support.microsoft.com/kb/973705

Security Update for SQL Server 2005 Service Pack 3 (KB970892)
Date last published: 10/13/2009

http://support.microsoft.com/kb/970892

Actualització 2009/10/14: Les actualitzacions també estan disponibles per a Windows 2003 Server 64 bit.