[Pregunta]: Detectar acentos en consulta

Iniciado por Leguim, 25 Agosto 2019, 18:22 PM

0 Miembros y 2 Visitantes están viendo este tema.

Leguim

¿Algo así?
Ya se  ya se, soy un desastre...

Código (php) [Seleccionar]

function Conexion($user, $pass)
{
try
{
$con = new PDO('mysql:host=localhost;dbname=datos', $user, $pass);
echo $con->query('SELECT @@character_set_client');
return $con;
}
catch(PDOException $e)
{
return $e->getMessage();
}
}

EdePC

#11
- Me he descargado una versión viejita de MySQL 5.6.35, y todo funciona correctamente también, jeje no logro replicar tu problema XD.

Citar-- MySQL dump 10.13  Distrib 5.6.35, for Win32 (AMD64)
--
-- Host: localhost    Database: pers
-- ------------------------------------------------------
-- Server version   5.6.35

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `persons`
--

DROP TABLE IF EXISTS `persons`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `persons` (
 `id_person` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) DEFAULT NULL,
 `surname` varchar(20) DEFAULT NULL,
 PRIMARY KEY (`id_person`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

- Por cierto, el dump lo hago ejecutando:

CitarD:\SFT\MySQL_5\mysql\bin>mysqldump -u root -p > dump_pers.txt

-----------

- Por cierto, para especificar o "setear" el CharSet UTF-8 con PDO lo hago con $con->exec("SET CHARACTER SET utf8"); así:

Citar<form action="#" method="post">
  <input type="text" name="busqueda" autocomplete="off">
  <input type="submit" value="Buscar">
</form>

<?php

  $busqueda = isset($_POST['busqueda']) ? $_POST['busqueda'] : '';

  $con = new PDO("mysql:host=127.0.0.1;dbname=pers", "root", "jameslafleur");
  $con->exec("SET CHARACTER SET utf8");
  $sql = "SELECT name, surname FROM persons WHERE CONCAT(name, ' ', surname) LIKE '%$busqueda%'";
  foreach ( $con->query($sql) as $row ) {
    echo $row['name'] . ' ' . $row['surname'] . '<br>';
  }

  // $sql = "INSERT INTO persons VALUES ( NULL, 'Salomé', 'García' )";
  // $con->query($sql);

?>

Leguim

#12
Cita de: EdePC en 27 Agosto 2019, 03:15 AM
- Me he descargado una versión viejita de MySQL 5.6.35, y todo funciona correctamente también, jeje no logro replicar tu problema XD.

- Por cierto, el dump lo hago ejecutando:


Woao te agradezco mucho el gesto!  :rolleyes:

eso donde lo ejecuto en la consola de phpmyadmin?

EDIT: me di cuenta que eso lo ejecutas en una consola jeje, cual es mysql.exe?

EdePC

- Revisa mi mensaje anterior que lo he actualizado (lo del PDO charset utf-8).

- Dependiendo de donde hayas instalado MySQL, tendrás que buscar los binarios del mysql. Lo más sencillo es abrir el Administrador de Tareas, buscar mysqld.exe (mysql daemon) este es el binario del servidor mysql en sí, pues a este le das click derecho > abrir ubicación de archivo, listo ahí debes tener a mysqldump.exe.

-- Ya luego abres una CMD y arrastras ese mysqldump.exe a tu consola, en mi caso:

Citarc:\Users\EdSon\Desktop>D:\SFT\MySQL_5\mysql\bin\mysqldump.exe -u root -p pers > pers_dump.txt
Enter password: ************

-- Y como estoy en el Desktop (Escritorio) me guarda ahí el fichero pers_dump-txt, -u root es para indicar el usuario, en mi caso root, -p es para que me pida ingresar la contraseña a la base de datos, luego con > pers_dump.txt guardo el fichero resultante.

MinusFour

#14
A ver, parece que se tiene que deletrear el código por lo que veo...

Código (php) [Seleccionar]

$mysqli = new mysqli('localhost', 'usuario', 'contraseña', 'basededatos');
echo mysqli_character_set_name($mysqli);


Esto es para obtener el charset de la conexión en MySQLi. Esto es para obtener el charset de la conexión en PDO:

Código (php) [Seleccionar]

$db = new PDO('mysql:host=localhost;dbname=basededatos', 'usuario', 'contraseña');
var_dump($db->query('SELECT @@character_set_client')->fetchAll());


Lee muy bien el código. Necesitas especificar, usuario, contraseña y base de datos. Si no usas localhost también tienes que especificar el servidor.

Técnicamente también deberías preocuparte por character_set_connection, pero por lo pronto esto debería bastar para darnos una idea.

Leguim

#15
Ya pude!

Código (php) [Seleccionar]

-- MySQL dump 10.16  Distrib 10.1.37-MariaDB, for Win32 (AMD64)
--
-- Host: localhost    Database: basedatos
-- ------------------------------------------------------
-- Server version 10.1.37-MariaDB

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `usuarios`
--

DROP TABLE IF EXISTS `usuarios`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `usuarios` (
 `id_user` int(50) NOT NULL AUTO_INCREMENT,
 `name` varchar(25) COLLATE utf8_spanish_ci DEFAULT NULL,
 `surname` varchar(25) COLLATE utf8_spanish_ci DEFAULT NULL,
 `email` varchar(200) COLLATE utf8_spanish_ci DEFAULT NULL,
 `password` varchar(200) COLLATE utf8_spanish_ci DEFAULT NULL,
 `year_birth` int(2) DEFAULT NULL,
 `month_birth` int(2) DEFAULT NULL,
 `day_birth` int(2) DEFAULT NULL,
 `sex` int(2) DEFAULT NULL,
 `avatar` varchar(200) COLLATE utf8_spanish_ci DEFAULT NULL,
 PRIMARY KEY (`id_user`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `usuarios`
--

LOCK TABLES `usuarios` WRITE;
/*!40000 ALTER TABLE `usuarios` DISABLE KEYS */;
INSERT INTO `usuarios` VALUES (1,'Míguel','Cañellas','canellasmiguel2000@gmail.com','d123c4898730d77d2672621636b8376822bf7cd5df07f4bc1d0d13em7pr2f221e0223kf7dfd9f7d0847149efa5e4afzcd2a54af4uv8b3776e1c4d7f82be09a10d7',2000,6,4,1,'78180511T20198102052.jpeg');
/*!40000 ALTER TABLE `usuarios` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2019-08-26 23:27:55


pasarón 86 años pero ya pude! jaja

el charset me devolvio esto
Código (php) [Seleccionar]

array(1) { [0]=> array(2) { ["@@character_set_client"]=> string(6) "latin1" [0]=> string(6) "latin1" } }

MinusFour

Nosotros solo vamos a poder ver UTF-8 porque es el encoding que usa el foro. Tendrías que subir el archivo a algún lado o nos puedes dar el dump en hexadecimal (pero no lo hagas). Como dije, la forma más simple de revisar si el archivo está en Windows 1252, es simplemente usar un editor que te permita abrir el archivo usando otros encodings.

Sublime es gratis, tiene está función y es super sencillo de usar. Notepad++ también tiene una función similar.

O podrías darnos el hexadecimal de los caracteres relevantes. Tampoco es difícil.

Si tuviera que adivinar tienes:


0x4d 0xc3 0x83 0xc2 0xad 0x67 0x75 0x65 0x6c


Para el string de: Míguel

Leguim

Cita de: MinusFour en 27 Agosto 2019, 04:52 AM
Nosotros solo vamos a poder ver UTF-8 porque es el encoding que usa el foro. Tendrías que subir el archivo a algún lado o nos puedes dar el dump en hexadecimal (pero no lo hagas). Como dije, la forma más simple de revisar si el archivo está en Windows 1252, es simplemente usar un editor que te permita abrir el archivo usando otros encodings.

Sublime es gratis, tiene está función y es super sencillo de usar. Notepad++ también tiene una función similar.

O podrías darnos el hexadecimal de los caracteres relevantes. Tampoco es difícil.

Si tuviera que adivinar tienes:


0x4d 0xc3 0x83 0xc2 0xad 0x67 0x75 0x65 0x6c


Para el string de: Míguel

Si yo uso sublime sería cosa de pegar el dump en sublime text y en que parte esta esa funcionalidad de la que hablas?
y sobre lo del charset que me devolvió "latin_1" esto podría ser lo que me de el fallo de no reconocer acentos?

MinusFour

Cita de: MiguelCanellas en 27 Agosto 2019, 04:58 AM
Si yo uso sublime sería cosa de pegar el dump en sublime text y en que parte esta esa funcionalidad de la que hablas?
y sobre lo del charset que me devolvió "latin_1" esto podría ser lo que me de el fallo de no reconocer acentos?

No se si haya menus en español, yo tengo mi sublime en inglés. Pero primero abro el archivo con sublime y después voy a File->Reopen With Encoding->Windows 1252. Yo creo que el archivo si está en UTF-8....

Lo del charset, si es muy probable que este afectando tu información. Porque la información viaja codeada en ISO-8859-1 (Mysql no usa Windows 1252??), lo que significa que tu cliente malforma el texto UTF-8.

Para PDO puedes hacer:

Código (php) [Seleccionar]
$db = new PDO('mysql:host=localhost;dbname=basededatos;charset=utf8', 'usuario', 'contraseña');

Y yo probaría de nuevo con el query para estar seguro.

Leguim

#19
Cita de: MinusFour en 27 Agosto 2019, 05:12 AM
No se si haya menus en español, yo tengo mi sublime en inglés. Pero primero abro el archivo con sublime y después voy a File->Reopen With Encoding->Windows 1252. Yo creo que el archivo si está en UTF-8....

Lo del charset, si es muy probable que este afectando tu información. Porque la información viaja codeada en ISO-8859-1 (Mysql no usa Windows 1252??), lo que significa que tu cliente malforma el texto UTF-8.

Para PDO puedes hacer:

Código (php) [Seleccionar]
$db = new PDO('mysql:host=localhost;dbname=basededatos;charset=utf8', 'usuario', 'contraseña');

Y yo probaría de nuevo con el query para estar seguro.



Hice eso pero el resultado ahora aparece así en la pantalla, lo imprime así:

Míguel Cañellas
de igual forma sigue sin funcionar ahora aunque escriba "mí" no lo encuentra

EDIT: el charset igualmente ahora si sale en utf8