php - utf8 - MySQL corta cadena en caracteres especiales
mostrar ñ en php (7)
Acabo de resolver un problema similar. Mi problema era que estaba tratando de insertar datos codificados Latin-1 en una tabla codificada UTF-8. Verifique dos veces la codificación de sus datos: es probable que obtenga datos que no sean UTF-8 de su entrada.
Estoy tratando de insertar datos POST remotos (artículos enviados por iSnare) en MySQL con PHP. Los datos provienen con éxito del remitente POST remoto y puedo escribirlos en un archivo de texto sin problemas.
Desafortunadamente, cuando se trata de insertarlo en MySQL, MySQL corta cadena (artículo) en char especial. Intenté muchas cosas pero aún no he tenido éxito.
Lo intenté:
- Escapar de los caracteres con
mysql_real_escape_string()
- Usando
htmlentities()
yhtmlspecialchars()
(con cada parámetro ...) - Enviando
SET NAMES utf8
consultaSET NAMES utf8
a MySQL antes de hacer todo lo demás - Todas las tablas y columnas están codificadas en UTF-8 y
utf8_general_ci
(también se intentóutf8_unicode_ci
yutf8_bin
como intercalación) - Guardando todos los archivos PHP como UTF-8
Aún así no pude encontrar la solución. Apreciaré mucho si alguien puede ayudarme a resolver este problema.
Aquí está la definición de mi tabla y los códigos PHP:
PHP
function guvenlik_sql($x){
// Cleans inputs agains sql injection
return mysql_real_escape_string(htmlentities(stripslashes($x)), ENT_QUOTES);
}
// Check if data really comes from an Isnare.com server (Address hidden)
if ($_SERVER[''REMOTE_ADDR''] == $isnareIP || $_SERVER[''REMOTE_ADDR''] == "xxx.xxx.xxx.xxx") {
$title = guvenlik_sql($_POST["article_title"]);
$first_name = guvenlik_sql($_POST["article_author"]);
$description = guvenlik_sql($_POST["article_summary"]);
$category = guvenlik_sql($_POST["article_category"]);
$article = guvenlik_sql($_REQUEST["article_body_text"]);
$article_html = guvenlik_sql($_POST["article_body_html"]);
$resource_box = guvenlik_sql($_POST["article_bio_text"]);
$resource_box_html = guvenlik_sql($_POST["article_bio_html"]);
$keywords = guvenlik_sql($_POST["article_keywords"]);
$email = guvenlik_sql($_POST["article_email"]);
$fp = fopen(''test.txt'', ''a'');
fwrite($fp, $title."/n");
fwrite($fp, $article."/n/n/n/n");
fclose($fp);
mysql_query("INSERT INTO articles " .
"(" .
"first_name, " .
"email, " .
"title, " .
"description, " .
"article, " .
"article_html, " .
"category, " .
"resource_box, " .
"resource_box_html, " .
"keywords, " .
"distributor, " .
"distributor_host" .
") VALUES (" .
"''$first_name'', " .
"''$email'', " .
"''$title'', " .
"''$description'', " .
"''$article'', " .
"''$article_html'', " .
"''$category'', " .
"''$resource_box'', " .
"''$resource_box_html'', " .
"''$keywords'', " .
"''$isnare'', " .
"''$_SERVER[''REMOTE_ADDR'']'', " .
")") or die(mysql_error());
} //end if security
Definicion de la tabla
CREATE TABLE `articles` (
`article_ID` int(11) NOT NULL auto_increment,
`first_name` varchar(100) NOT NULL,
`last_name` varchar(100) NOT NULL,
`email` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`author_url` varchar(255) NOT NULL,
`company_name` varchar(100) NOT NULL,
`address1` varchar(100) NOT NULL,
`address2` varchar(100) NOT NULL,
`state_2digit` varchar(100) NOT NULL,
`state` varchar(100) NOT NULL,
`zip_code` varchar(100) NOT NULL,
`country` varchar(100) NOT NULL,
`phone` varchar(100) NOT NULL,
`newsletter` varchar(100) NOT NULL,
`title` varchar(255) NOT NULL,
`description` text NOT NULL,
`article` longtext NOT NULL,
`article_html` longtext NOT NULL,
`category` varchar(100) NOT NULL,
`cat` varchar(100) NOT NULL,
`resource_box` text NOT NULL,
`resource_box_html` longtext NOT NULL,
`keywords` varchar(255) NOT NULL,
`publish_date` timestamp NOT NULL default CURRENT_TIMESTAMP,
`distributor` varchar(255) NOT NULL default '''',
`distributor_host` varchar(255) NOT NULL,
PRIMARY KEY (`article_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC
"Establecer nombres utf8" solo establece el conjunto de caracteres para los nombres de tabla y columna, también debe usar "set character set utf8" para el conjunto de caracteres de contenido.
¿Estás seguro de que la cadena no está cortada porque fue más larga de lo que permite la definición de tu columna?
El problema también podría ser que los datos se almacenan correctamente en la base de datos, pero la aplicación que usa para mostrar los datos de la base de datos corta la cadena mostrada. Esto ocurre principalmente con cadenas que contienen caracteres nulos en aplicaciones basadas en Windows, ya que los controles de Windows usan cadenas terminadas en nulos internamente.
1) ponga esa cadena sql que está generando en una variable y escríbala en un archivo antes de enviarla a MySQL (para que pueda ver exactamente lo que se está enviando)
2) mysqld tiene una configuración " max_allowed_packet
" que creo que interrumpe las consultas largas.
3) estás pasando ENT_QUOTES
a mysql_real_escape_string()
. Creo que quieres pasarlo a htmlentities ()
Para aquellos que podrían tener el mismo problema y las respuestas anteriores no ayudan, recibí otra sugerencia: ¡compruebe el TIPO DE CONTENIDO! Debería ser así:
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
Tenía el mismo problema que tenía Donald - esto hizo MAGIC :) (No imaginé que el colegue que trabajó en el archivo en primer lugar no lo había arreglado ...)
Acabo de tratar con la misma situación, las entradas se cortaron donde se supone que es el personaje especial (ä, ö, è, etc.). Todos mis archivos están codificados en UTF8, la conexión está codificada en UTF8, las intercalaciones de tablas son UTF8, aún así las entradas fueron cortadas.
Mi solución fue: ¡aún más codificación UTF! :) Use utf8_encode()
en las entradas que pueden contener caracteres especiales.
mysql_query("INSERT INTO articles (first_name, email, title, description, article, article_html, category, resource_box, resource_box_html, keywords, distributor, distributor_host) values (
''" . utf8_encode($first_name) . "'',
''" . $email . "'',
''" . utf8_encode($title) . "'',
''" . utf8_encode($description) . "'',
// etc
Usar mysqli_set_charset
es lo que me salvó el día:
$conn = new mysqli($host, $username, $password, $database);
mysqli_set_charset($conn, ''utf8'');