2010-04-11 4 views
4

J'ai une table MySQL qui a un jeu de caractères UTF-8 et lors d'une tentative d'insérer à lui via un formulaire PHP, la base de données donne l'erreur suivante:UTF-8 Base de données Problème

PDOStatement::execute(): SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE8' for column ...

Le caractère La question est 'è', mais je ne vois pas pourquoi cela devrait poser un problème étant donné que la base de données et la table sont configurées en UTF-8.

Modifier

J'ai essayé directement depuis le terminal mysql et ont le même problème.

+0

Avez-vous essayé mysql_query ('SET NAMES UTF-8') avant de faire vos requêtes? – Tom

+0

Oui j'ai essayé cela (c'est UTF8, pas UTF-8 btw :) – Danten

+0

Encore une autre idée concernant votre commentaire ci-dessous: Avez-vous vérifié que le jeu de caractères utilisé pour envoyer le formulaire est UTF-8 (côté client; ou en-tête/méta-attribut et peut-être aussi appliqué par

)? PHP peut ou non utiliser UTF-8 en interne (php.ini), mais sur certains serveurs, vous n'êtes pas autorisé à modifier dynamiquement ce jeu de caractères. Si PHP utilise un jeu de caractères de 8 bits, il doit toujours transmettre votre texte codé en UTF-8 à la base de données (mysql_real_escape_string fonctionne en fonction du jeu de caractères de la base de données) mais PHP peut avoir besoin de utf8_decode/utf8_encode. – Energiequant

Répondre

1

E8 est supérieur au caractère utilisable maximal 7F dans un caractère UTF8 d'un octet: http://en.wikipedia.org/wiki/UTF-8

Il semble que votre connexion n'est pas réglé sur UTF8 mais un autre encodage 8 bits comme ISO Latin. Si vous définissez la base de données sur UTF8, vous ne modifiez que le jeu de caractères utilisé en interne par la base de données, les connexions peuvent être différentes (latin1 pour les anciennes versions MySQL). Vous devriez donc essayer d'envoyer un SET CHARACTER SET utf-8 initial après vous être connecté à la base de données. Si vous avez accès à my.cnf, vous pouvez également y définir la valeur par défaut, mais gardez à l'esprit que la modification de la valeur par défaut peut entraîner la rupture de tout autre site/application fonctionnant sur le même hôte.

+1

Merci, le problème a été surmonté en utilisant la fonction utf8_encode() de php. – Danten

+0

'SET CHARACTER SET' n'est pas la bonne commande pour cela (voir: http://stackoverflow.com/questions/1566602/is-set-character-set-utf8-necessary), et il devrait être« utf8 », pas 'utf-8'. @Danten, vous ne devriez pas avoir besoin d'utiliser 'utf8_encode()' si vous avez tout configuré correctement. – mercator

+0

Pour une raison quelconque, SET NAMES n'a jamais fonctionné comme nous en avions besoin sur certains serveurs de nos clients (sur certains serveurs, il semblait n'avoir aucun effet).La dénomination des jeux de caractères diffère malheureusement en fonction de la distribution que vous utilisez. utf-8 était disponible sur tous les serveurs sur lesquels nous étions déployés alors que utf8 était parfois inconnu. Cependant, étant donné que nous devons prendre en charge des espaces Web étrangement hébergés, certains d'entre eux peuvent avoir été mal configurés. Dans tous les cas, au moins le jeu de caractères (et peut-être la commande elle-même) devrait être conservé dans un fichier de configuration si des modifications doivent être apportées rapidement lors du déploiement. – Energiequant

2

Votre base de données peut être définie sur UTF-8, mais la connexion à la base de données doit également être définie sur UTF-8. Vous devriez le faire avec une instruction SET NAMES utf8. Vous pouvez utiliser le driver_options en AOP pour avoir exécuter que dès que vous connectez:

$handle = new PDO("mysql:host=localhost;dbname=dbname", 
    'username', 'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); 

Jetez un oeil sur les deux liens suivants pour obtenir des informations plus détaillées sur en vous assurant ensemble de votre site utilise UTF-8 appropriée:

+0

Pour référence future, je l'ai fait. Le problème était des chaînes multi-octets. – Danten

1

Avant de passer la valeur à Mysql vous pouvez utiliser la code suivant:

$val = mb_check_encoding($val, 'UTF-8') ? $val : utf8_encode($val);

convertir la chaîne l'UTF-8, S'il est question d'un seul domaine.

+0

Vous devriez certainement éviter de le faire! La vérification de l'encodage est consommatrice et n'est pas toujours précise: mieux vaut essayer de savoir ce que l'encodage est effectivement par d'autres moyens (si vous n'avez pas la moindre chance de ne pas avoir la moindre idée, c'est souvent mentionné). – JeromeJ

+0

Oui, vous avez raison. Ce qui est mentionné est la solution rapide pour résoudre le problème. Vous devriez résoudre le problème en utilisant Mysql – purab

Questions connexes