2012-05-15 2 views
1

У меня проблема с вставкой строк в мою БД. Когда строка содержит символы типа: 'è', 'ò', 'ò', '€', '²', '³' .... и т. Д., Она возвращает ошибку, подобную этой (набор символов utf8):utf8 и utf8_general_ci

Incorrect string value: '\xE8 pass...' for column 'descrizione' at row 1 - INSERT INTO materiali.listino (codice,costruttore,descrizione,famiglia) VALUES ('E 251-230','Abb','Relè passo passo','Relè'); 

Но, если установить кодировку для latin1 или * utf8_general_ci * он отлично работает, и никаких ошибок не обнаружено.

Может кто-нибудь объяснить мне, почему это происходит? Я всегда думал, что utf8 был «больше», чем latin1

EDIT: Я также попытался использовать mysql_real_escape_string, но ошибка всегда была такой же !!!!

+0

В MySQL нет кодировки 'utf8'. Какую кодировку вы используете при наличии ошибки? –

+1

@webbandit: [Да, есть] (http://dev.mysql.com/doc/en/charset-unicode-sets.html). – eggyal

+0

О, сортировка ... –

ответ

3

Согласно doc для UTF-8, сортировки по умолчанию utf8_general_ci. Если вам нужен конкретный заказ в алфавите, который не является номером general_ci, вы должны выбрать один из сопоставлений utf8_*, которые предусмотрены для кодировки utf8, в зависимости от ваших требований в период заказа.

Как ваша таблица, так и ваше соединение с БД должны быть закодированы в utf8, предпочтительно в том же порядке, read more about setting connection collation.

Чтобы быть полностью безопасным, вы должны проверить таблицы сортировки и убедитесь, что это utf8_* и что соединение слишком, используя полный синтаксис SET NAMES

SET NAMES 'utf8' COLLATE 'utf8_general_ci' 

Вы можете найти сведения о разные параметры сортировки here

+0

Я, наконец, сработал с вашим решением -> «SET NAMES 'utf8' COLLATE 'utf8_general_ci'" .. Большое спасибо! – Yuri

+0

Вы можете подумать о принятии моего ответа тогда ;-) И я рад, что это помогает. –

5

mysql_real_escape_string() не имеет отношения к делу, поскольку он просто избегает цитат завершения строки, которые в противном случае позволяли бы злоумышленнику вводить SQL.

действительно «больше», чем latin1, поскольку он способен представлять надмножество символов последнего. Однако не каждая байтовая последовательность представляет действительные utf8 символов; тогда как каждая возможная байтовая последовательность действительно соответствует latin1 символам.

Следовательно, если MySQL получает последовательность байтов, он ожидает, что будет utf8 (но это не так), некоторые символы могут вызвать эту ошибку «неправильного строкового значения»; тогда как если он ожидает, что байты будут latin1 (даже если это не так), они будут приняты, но неверные данные могут быть сохранены в таблице.

Ваша проблема почти наверняка заключается в том, что ваш набор символов соединения не соответствует кодировке, в которой ваше приложение отправляет свои строки. Используйте оператор SET NAMES, чтобы изменить набор символов текущего соединения, например. SET NAMES 'utf8', если ваше приложение отправляет строки, закодированные как UTF-8.

Подробнее о connection character sets.

Как и в сторону, utf8_general_ci не набор символов: это сверка для набора utf8 символов. The manual объясняет:

набор символов представляет собой набор символов и кодировок. A collation - это набор правил для сравнения символов в наборе символов.

0
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_general_ci'"); 

Eurika, выше сделал это :-)