• Publicidad

Perl, Excel, MySQL, tildes, eñes y problemas

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Perl, Excel, MySQL, tildes, eñes y problemas

Notapor MARKO » 2016-05-04 12:52 @577

¡¡¡Hola de nuevo, Perl en Español!!!

Publico acá de nuevo porque tengo un problema de ingreso de datos a base de datos MySQL (uso XAMPP).

Ingreso 7 datos a la tabla (6 ya que el id es autogenerado): año, mes, comercializador, código, usuario, energía.

Pero cuando los datos están tildados o tienen 'ñ' se guardan en la base de datos símbolos ilegibles.


Los caracteres que guarda son:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
en vez de ÁÉÍÓÚÑáéíóúñ guarda ÁÉÍÓÚÑáéíóúñ
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4



OJO: Este problema lo presenta cuando los datos los defino en el script o los obtengo de un textbox de Tk pero si los datos los obtengo de una hoja de Excel el ingreso en la base de datos se da sin problemas.

Además los datos que se encuentran ingresados correctamente con tildes y 'ñ' son visualizados correctamente sin problema en los Hlist de Tk que uso para la visualización de datos.

Mi programa original es bastante extenso y tiene interfaz gráfica realizada en Tk. Publico acá un script corto que recrea el problema.

El cotejamiento de la base de datos MySQL es utf8_spanish_ci.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use warnings;
  3. use DBI;
  4. use Win32::OLE;
  5. use Win32::OLE::Variant;
  6. use Win32::OLE::Const 'Microsoft Excel';
  7.  
  8. # my $anio = '2017';
  9. # my $mes = '3';
  10. # my $comercializador = 'ÁÉÍÓÚÑáéíóúñ';  #esto lo tengo comentado cuando
  11. # my $codigo = 'codigo01';                 #lo estoy trayendo del excel
  12. # my $usuario ='ÁÉÍÓÚÑáéíóúñ';
  13. # my $energia = '325';
  14.  
  15.  
  16. my $excel = Win32::OLE->new('Excel.Application');
  17. $excel -> {Visible} = 1;
  18. $excel    -> {DisplayAlerts} = 0;
  19. my $libro = $excel->Workbooks->Open("C:\\Users\\jarias\\Desktop\\Book1.xlsx");
  20. my $hoja = $libro->Worksheets('Sheet1');
  21. $hoja->Activate();
  22.  
  23. my $anio = $hoja->Range('A2')->{Value};
  24. my $mes = $hoja->Range('B2')->{Value};
  25. my $comercializador = $hoja->Range('C2')->{Value};
  26. my $codigo = $hoja->Range('D2')->{Value};
  27. my $usuario = $hoja->Range('E2')->{Value};
  28. my $energia = $hoja->Range('F2')->{Value};
  29.  
  30.  
  31. my $dbname = 'Grandes_Usuarios';
  32. my $dbhost = 'localhost';
  33. my $dbuser = 'root';
  34. my $dbh = DBI->connect("DBI:mysql:$dbname;host=$dbhost", $dbuser)
  35. or die "Error de conexion: $DBI::errstr";
  36.                                
  37. my $sql = "     INSERT INTO EC15 VALUES ('','$anio', '$mes', '$comercializador', '$codigo', '$usuario', '$energia')";
  38.  
  39. &Base_Datos($sql, $dbh);
  40.  
  41. $dbh->disconnect();
  42.  
  43. sub Base_Datos{
  44.        
  45.         #se le entrega el query y la base de datos si es un SELECT devuelve una variable ($registros)
  46.     #con el número de filas y
  47.     #   %Hash_Resultado{
  48.     #                                   1 =>    [columna,columna,columna...],
  49.     #                                   2 =>    [columna,columna,columna...],
  50.     #                                   .
  51.     #                                   .
  52.     #                                   .
  53.     #                   $registros =>   [columna,columna,columna...]
  54.     #   }
  55.  
  56.     # si no es SELECT ejecuta el query y no devuelve nada
  57.        
  58.  
  59.         my ($sql, $dbh) = @_;
  60.        
  61.         my $sth = $dbh->prepare ( $sql );
  62.         $sth->execute();
  63.        
  64.         my $registros = 0;
  65.         my %Hash_Resultado;
  66.  
  67.         if ($sql =~ /SELECT /i){
  68.                 while( my @arreglo_fila  = $sth->fetchrow_array){
  69.                         $registros++;
  70.                         push(@{$Hash_Resultado{$registros}}, @arreglo_fila);
  71.                 }
  72.                 return($registros,%Hash_Resultado);    
  73.         }
  74.         else{
  75.                 return ();
  76.         }
  77. }
  78.  
  79.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Comento también que estoy escribiendo el código en Sublime Text 2 y todo corre en Windos 7.

Gracias por adelantado.
MARKO
Perlero nuevo
Perlero nuevo
 
Mensajes: 86
Registrado: 2012-01-10 22:34 @982

Publicidad

Re: Perl, Excel, MySQL, tildes, eñes y problemas

Notapor explorer » 2016-05-04 16:44 @739

Has dado todos los datos, menos el esencial: ¿en qué codificación está tu código de programa? ¿en qué codificación está la hoja Excel? ¿y la base de datos?

El cotejamiento es la ordenación de los datos, no la codificación.

Si dices que el paso de la información de Excel a la base de datos se produce sin problemas, es que los dos están trabajando en la misma codificación.

Como en tu programa no realizas ningún tipo de interpretación de lo que lees y de lo que escribes, pues la información pasa de forma literal.

El problema está solo en los literales que pones en tu programa. Y para ello debemos saber en qué está codificado.

El primer texto que muestras ya indica una codificación tipo UTF-8, así que es muy posible que sea esa. Si es así, te vale con poner

use utf8;

como se indica en la receta 3 de cómo trabajar con Unicode con Perl. Si es otra codificación, pues habrá que buscar otra solución (también indicada en las recetas).

A partir de ahí, los literales dentro del programa están codificadas en UTF-8.

Otro tema es ver en qué codificación espera MySQL recibir los datos.

Casi siempre la solución es usar alguna de las funciones del módulo Encode, para pasar de una codificación a otra.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 17 invitados