<!--
-File $Id: ColumnTypes.html,v 1.1 2004/07/08 01:17:06 hlellelid Exp $
-License GNU FDL (http://www.gnu.org/copyleft/fdl.html)
-Copyright 2003, Propel project
-Author Hans Lellelid, hide@address.com
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Propel Guide</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<link rel="Stylesheet" rev="Stylesheet" href="../css/Documentation.css" type="text/css" charset="iso-8859-1"/>
</head>
<body>
<h1>Tipos de columna en Propel</h1>
<p>En este capítulo miraremos más de cerca los ipos de columnas disponibles para
usted en Propel. Los tipos de columnas que eliga afectaran el SQL que es
generado para su RDBMS y en algunos casos el comportamiento de la clase generada OM .
Los tipos de columnas en Propel son mapeadas directamente en los tipos de columnas
disponibles en Creole, La capa de abstracción de la base de datos usada por Propel,
y los tipos de columna de Creole están basados sobre una versión específica de los tipos JDBC. </p>
<p>El generador de clases de Propel traduce los tipos de columnas genericos en tipos
de columnas nativos para su RDBMS, y las clases del generador OM y el framework de
ejecución de propel aseguran que esos datos son corre tamente transformados por ello que sus
llamados de script no necesitan por si mismo tratar la implementacién de la base de datos.</p>
<h2><a name="ColumnTypes.Boolean"></a>Columnas tipo boolean</h2>
<p>Hay un tipo simple boolean en propel:</p>
<ul>
<li>BOOLEAN</li>
</ul>
<p>Este tipo es usado para representar valore de False/Veradero. En bases de datos que no
tienen columnas con tipos de datos nativo BOOLEAN/BIT, un INTEGER (o SMALLINT) será
en lugar de eso usa (0 = falso, 1 = verdadero).</p>
<pre title="Boolean column XML declaration"><table name="bool_test">
<column name="boolval" type="BOOLEAN" defaultValue="true"/>
</table></pre>
<p>En PostgreSQL, por ejemplo, esto generará:</p>
<pre title="Boolean column table creation SQL">CREATE TABLE bool_test (
boolval bit NOT NULL default 't'
);</pre>
<p>El método accessor en la clase generada OM (ej. <strong>getBoolval()</strong>)
siempre retornará valores tipo boolean, indiferente de la implementación de la base de datos.</p>
<h2><a name="ColumnTypes.Numeric"></a>Columnas de tipo numérico </h2>
<p>Hay varios tipos numéricos disponibles:</p>
<ul>
<li>TINYINT</li>
<li>INTEGER</li>
<li>BIGINT</li>
<li>DOUBLE</li>
<li>DECIMAL</li>
<li>FLOAT</li>
<li>REAL</li>
</ul>
<p>Usted puede usar los atributos <strong>size</strong> y <strong>scale</strong> para
aplicar a los tipos de soluna numéricos. Si estos son incluidos en los archivos generados
SQL dependerá de su RDBMS.</p>
<pre title="Numeric column XML declaration"><table name="num_test">
<column name="num" type="FLOAT" size="10" scale="2"/>
</table></pre>
<p>En MySQL, por ejemplo, esto generará:</p>
<pre title="Numeric column table creation SQL">CREATE TABLE num_test (
num FLOAT(10,2) NOT NULL
) Type=MyISAM;</pre>
<p>El tipo numérico sólo afecta el SQL generado y no la clase generada OM.</p>
<p>Note que usted puede muy bien abilitar el almacenamiento de números con gran precisión
en su base de datos que puede introducir en PHP. revise los ajustes de <em>precisión</em> en
su archivo <tt>php.ini</tt> si encuentra truncación.</p>
<h2><a name="ColumnTypes.String"></a>Columnas Tipo String </h2>
<p>Hay varios tipos de string en Propel:</p>
<ul>
<li>CHAR</li>
<li>VARCHAR</li>
<li>LONGVARCHAR</li>
</ul>
<p>Estas columnas son equivalentes para RDBMS. CHAR es para representar
longitud de strings ajustados, mientras los strings VARCHAR pueden varias en tamaƱo. Usted puede especificar
un atributo <strong>size</strong> para ambos tipos. Generalmente el atributo <strong>size</strong>
para LONGVARCHAR será ignorado. algunas bases de datos (ej. MySQL, PostgreSQL,
Microsoft SQL Server) usa un tipo de dato TEXT para LONGVARCHAR.</p>
<p>Las columnas de estos tipos siempre se almacenan como valores string y retornarán
valores tipo string. Note que los valores retornados siempre tendrán alguna huella
con espacio en blanco arreglado. Algunas RDBMS harán esto automaticamente (ej. MySQL) mientras
que otras no (ej. PostgreSQL).</p>
<h2><a name="ColumnTypes.LOB"></a>Columnas de Tipo LOB</h2>
<p>LOB <strong>L</strong>ocator <strong>OB</strong>ject.(Localizador de OBjeto) hay 2
tipos de columna LOB en Propel:</p>
<ul>
<li>CLOB</li>
<li>BLOB</li>
</ul>
<p>Estos tipos de datosmerecen una atención especial porque son manejadas lijeramente
diferente desde otros tipos de datos en Propel. Los resultados para los tipos de datosr LOB son retornados
como objetos de tipo <strong>creole.util.Blob</strong> o <strong>creole.util.Clob</strong>,
dependiendo del tipo de columna. Estas clases proveen algunos métodos útiles (ej.
para escribir a un archivo o descargado a un buffer); Ellos tambiéno proveen un método <strong>__toString()</strong>
con el que usted puede llamar código, escoger o ignorar los objetos. <em>Nota: en PHP5.0.0RC1
en el método <strong>__toString()</strong> la invocación automática para el casting(string)
ha sido desabiitado por ahora, usted debe explícitamente invocar el método <strong>__toString()</strong>sobre objetos.</em></p>
<p>Mire el siguiente esquema de ejemplo:</p>
<pre title="LOB column declaration"><table name="lob_test">
<column name="photo" type="BLOB"/>
</table></pre>
<p>El llamado a código PHP necesita hacer uns casting de resultados de estas columnas a string
explícitamente (para llamar al método <strong>__toString() </strong>) - <em>por ahora debe explícitamente
llamar al método <strong>__toString()</strong> en PHP.</em>:</p>
<pre title="Retrieving contents of LOB column">$lob = LobTestPeer::doSelectOne(new Criteria());
$bits = $lob->getPhoto()->__toString(); // yuk, we know; convince php devs to restore automatic __toString()</pre>
<p>... o puede llamar el método <strong>Lob::getContents()</strong>directamente:</p>
<pre title="Explicitly retrieving LOB contents">$bits = $lob->getPhoto()->getContents();
</pre>
<p>... o puede usar el método utilitario para guardarlo en un archivo:</p>
<pre title="Writing LOB contents to file">$lob->getPhoto()->writeToFile('/tmp/photo.gif');
</pre>
<p>... o puede lanzar los contenidos al buffer:</p>
<pre title="Dumping LOB contents">$lob->getPhoto()->dump();
</pre>
<h2><a name="ColumnTypes.DateTime"></a>Columnas de tipo fecha y hora</h2>
<p>Los tipos de columna fecha y hora en Propel son:</p>
<ul>
<li>DATE</li>
<li>TIME</li>
<li>TIMESTAMP</li>
</ul>
<p>La mayoría de las bases de datos tiene equivalaencias directas para estos tipos en Propel. No tiene valor
que para MySQL el tipo de dato TIMESTAMP actualmente mapee a DATETIME. La capa Creole
actualmente transforma fechas y horas dentro de los valores por defecto para su país,
proporcionando consistencia a través de terminaciones anteriores en bases de datos.</p>
<pre title="numeric column declaration"><table name="date_test">
<column name="birth_date" type="DATE"/>
<column name="birth_time" type="TIME"/>
<column name="updated" type="TIMESTAMP"/>
</table></pre>
<p>El siguiente es un ejemplo de código PHP:</p>
<pre title="numeric column declaration">print $obj->getBirthDate() . "\n";
print $obj->getBirthTime() . "\n";
print $obj->getUpdate() . "\n";</pre>
<p>Debería tener la siguiente salida en un sistema con configuración <strong>en_US</strong>:</p>
<pre title="Output on system using en_US locale">03/02/1998
12:34:23 AM
2003-12-21 18:32:01
</pre>
<p>... pero la siguiente salida en un sistema con configuración<strong> de_DE</strong>:</p>
<pre title="Output on system using de_DE locale">02.03.1998
00:34:23
2003-12-21 18:32:01</pre>
<p>Note que usando la función de PHP <strong>setlocale()</strong> cambiará
el valor de retorno de accsesos para las columnas DATE o TIME . El valor TIMESTAMP
es formateado usando ISO 8601 indiferente de la configuración local.</p>
<h4>Personalizar los formatos de fechas</h4>
<p>Importantemente, usted puede ahora también passar una fecha en format string al método asesor para las columnas fecha/hora columns. Incluso puede pasar NULL para tener los métodos y retornar el integrador unix timestamp.</p>
<pre title="passing date formatters">print $obj->getBirthDate('n/j') . "\n";
print $obj->getBirthTime('%X') . "\n";
print $obj->getUpdate(null) . "\n";</pre>
<p>Debería obtener la siguiente salida en un sistema con configuración <strong>en_US</strong>(en este ejemplo, la configuración local sólo afecta el llamado <strong>getBirthTime()</strong> , el cual es usa un configuracién local sensitiva <strong>strftime()</strong>-tipo de formato string):</p>
<pre title="Output using custom format strings">3/2
12:34:23 AM
1072049521</pre>
</body>
</html>