para modules guide descargar php mysql drupal

php - modules - drupal install guide



Insertar cadena codificada en UTF-8 en la tabla mysql codificada en UTF-8 falla con "Valor de cadena incorrecto" (3)

Insertar una cadena codificada en UTF-8 en una tabla codificada en UTF-8 da un valor de cadena incorrecto.

PDOException: SQLSTATE [HY000]: Error general: 1366 Valor de cadena incorrecto: ''/ xF0 / x9D / x84 / x8E i ...'' para la columna ''body_value'' en la fila 1: INSERT INTO

Tengo un carácter, en una cadena que mb_detect_encoding claims tiene codificación UTF-8. Intento insertar esta cadena en una tabla MySQL, que se define como (entre otras cosas) DEFAULT CHARSET=utf8

Editar: Drupal siempre hace SET NAMES utf8 con COLLATE opcional (al menos cuando habla con MySQL).

Editar 2: algunos detalles más que parecen ser relevantes. Agarro algo de texto de una base de datos PostgreSQL. Lo pego en un objeto, uso mb_detect_encoding para verificar que sea UTF-8 y persista el objeto en la base de datos, usando node_save . Entonces, si bien hay una solicitud HTTP que desencadena la importación, los datos no provienen del navegador.

Edición 3: los datos se desnormalizan en dos tablas:

SELECCIONAR character_set_name FROM information_schema. COLUMNS C DONDE table_schema = "[base de datos]" Y table_name IN ("field_data_body", "field_revision_body") AND column_name = "body_value";

>+--------------------+ | character_set_name | +--------------------+ | utf8 | | utf8 | +--------------------+

Edición 4: ¿Es posible que el personaje sea "nuevo"? Estoy más que un poco confuso sobre la relación entre Unicode y UTF-8 , pero este artículo de wikipedia implica que el personaje fue estandarizado muy recientemente.

No entiendo cómo puede fallar con "Valor de cadena incorrecto".


En su conexión PDO, configure el juego de caracteres.

new PDO(''mysql:host=localhost;dbname=the_db;charset=utf8'', $user, $password);


𝄎 (U + 1D10E) es un carácter Unicode encontrado fuera del BMP (Plano multilingüe básico) (arriba U + FFFF) y, por lo tanto, no se puede representar en UTF-8 en 3 bytes. MySQL charset utf8 solo acepta caracteres UTF-8 si se pueden representar en 3 bytes. Si necesita almacenar esto en MySQL, necesitará usar el conjunto de caracteres MySQL utf8mb4. Necesitarás MySQL 5.5.3 o posterior. Puede usar ALTER TABLE para cambiar el conjunto de caracteres sin mucho problema; ya que necesita más espacio para almacenar los caracteres, aparecen un par de problemas que pueden requerir que reduzca el tamaño de la cadena. Ver http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-upgrading.html .


para resolver este problema, primero cambia el campo de su base de datos a utf8m4b charset. Por ejemplo:

ALTER TABLE `tb_name` CHANGE `field_name` `field_name` VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL;

luego, en su conexión db, establezca driver_options para utf8mb4. Por ejemplo, si usa PDO

$db = new PDO(''mysql:host=localhost;dbname=testdb;charset=utf8mb4'', ''username'', ''password'');

o en zend framework 1.2

$dbParam = array(''host'' => ''localhost'', ''username'' => ''db_user_name'', ''password'' => ''password'', ''dbname'' => ''db_name'', ''driver_options'' => array( ''1002'' => "SET NAMES ''utf8mb4''", ''12'' => 0 ) );