hi every one i have a problem in mysql
my table is
CREATE TABLE IF NOT EXISTS `contactform` (
`contact_id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(50) NOT NULL,
`addition` varchar(50) NOT NULL,
`surname` varchar(50) NOT NULL,
`Address` varchar(200) NOT NULL,
`postalcode` varchar(20) NOT NULL,
`city` varchar(50) NOT NULL,
`phone` varchar(20) NOT NULL,
`emailaddress` varchar(30) NOT NULL,
`dob` varchar(50) NOT NULL,
`howtoknow` varchar(50) NOT NULL,
`othersource` varchar(50) NOT NULL,
`orientationsession` varchar(20) NOT NULL,
`othersession` varchar(20) NOT NULL,
`organisation` int(11) NOT NULL,
`newsletter` int(2) NOT NULL,
`iscomplete` int(11) NOT NULL,
`registrationdate` date NOT NULL,
PRIMARY KEY (`contact_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=39 ;
mysql>insert into contactform values('','abhi','sir','shukla','vbxcvb','342342','asdfasd','234234234','abhi@gmail.com','1999/5/16','via vrienden of familie','','19','20','6','1','1','2010-03-29')
i get following error.
#1366 — Incorrect integer value: » for column ‘contact_id’ at row 1
this query work fine on my local machine but give error on server
предисловие
Ошибка: Ошибка 1366: Неверное строковое значение
Анализ: настройка кодировки набора символов не соответствует содержимому, которое нужно вставить
Кодировка набора символов существует в двух местах
1. База данных
Во-вторых, код (диск для подключения к базе данных)
Большинство людей обращают внимание только на кодировку на уровне базы данных и забывают, что кодировка набора символов также требуется при подключении к базе данных с помощью кода.
Позвольте мне представить, как изменить кодировку набора символов этих двух мест
текст
1. Код (Драйвер для подключения к базе данных)
Это вопрос, который часто упускают из виду люди (я обычно тратил 2 дня на эту проблему, искал бесчисленное количество информации, но ничего не нашел и, наконец, обнаружил проблему случайно)
Используете ли вы Java, Python, Go или другие языки высокого уровня, если вы хотите управлять базой данных, вам нужен драйвер базы данных.
Затем будут некоторые конфигурации. Я представляю здесь конфигурацию драйвера языка Go для подключения к Mysql, как показано ниже:
mysql:
dbUser: "root"
dbPassword: ":123456"
dbTcp: "@tcp(localhost:3306)"
dbName: "/local_db"
dbParameters: "?charset=utf8mb4"
На самом деле, вышесказанное является полным предложением root:123456@tcp(localhost:3306)/local_db?charset=utf8mb4 Чтобы облегчить модификацию, я ее разобрал. Мы часто устанавливаем значение utf8 в конце и часто игнорируем это, что делает невозможным использование кода для вставки выражений эмодзи! Просто измените его на utf8mb4.
Во-вторых, база данных
По этому вопросу существует множество учебных пособий, в целом, существует четыре уровня кодирования базы данных.
- Сервер базы данных
- Библиотека
- стол
- поле
1. Чтобы изменить кодировку сервера базы данных, вам нужно изменить конфигурационный файл my.ini
Обычно Windows находится в каталоге C: \ ProgramData \ MySQL \ MySQL Server 5.7.
Linux обычно находится в /etc/my.cnf или /etc/mysql/my.cnf
Примерно в 65 строках my.ini будет предложение конфигурации, default-character-set = utf8, измените его на default-character-set = utf8mb4 и сохраните его, а затем раскомментируйте. Обратите внимание, что некоторые люди в Интернете говорят, что он должен быть под mysqld Он также настроен, фактически он не используется, по крайней мере, Mysql5.7 не используется, в противном случае, если вы настроите больше, служба базы данных может не перезапуститься.
Конечно, если ваша конфигурация по умолчанию находится под mysqld, то измените конфигурацию под mysqld. Одним словом, эта конфигурация предложения нуждается только в одном предложении.
Измененные и сохраненные результаты следующие:
После изменения конфигурации вам необходимо перезапустить сервер Mysql.
Windows может найти сервис в диспетчере задач, соответствующий Mysql57, щелкнуть правой кнопкой мыши для перезапуска.
Чтобы перезапустить Mysql в Linux, вам нужно использовать команду service mysql restart. Если эта команда не работает, вы можете попробовать перезапустить службу mysqld.
2. Библиотека
Вы можете использовать Navicat, щелкнуть правой кнопкой мыши имя библиотеки и выбрать «Редактировать базу данных».
Вы также можете использовать команду:
изменить имя библиотеки базы данных набор символов по умолчанию;
Затем установите соответствующий набор символов в utf8mb4
3. Стол
В настоящее время я не нашел набор символов визуальной операции для изменения таблицы, только с помощью команды
Синтаксис: изменить имя таблицы таблицы, преобразовать в набор символов;
4. Поле
Поля можно щелкнуть правой кнопкой мыши в таблице дизайна таблицы Navicat
Конечно, вы также можете использовать команду:
Синтаксис: изменить имя таблицы таблицы изменить имя поля атрибута набора символов набор символов;
Если ваше поле имеет тип varchar или другие типы символов, вы можете выбрать соответствующий набор символов ниже
подводить итоги
Мы склонны игнорировать некоторые незначительные детали, но иногда именно эти детали разрушают все здание!
При переносе очередного сайта и разворачивание его на VDS-ке, у меня появилась ошибка:
MySQL Query Error: [[1366] Incorrect string value: ‘\xB1N\xC30\x10\xFD…’ for column ‘COOKIES’ at row 1] |
Она была связана с тем, что не получалось сохраненить в БД куки из-за того что кодировка из скрипта не совпадала с кодировкой в БД.
Что бы это исправить, необходимо сменить кодировку в БД и определить эту кодировку в скриптах битрикса для подключения с базой данных. Т.к. ошибка может возникать из-за того, что пытается записать в БД символы, которые состоят не из 3 байтов, как в UTF-8, а из 4-х, то для хранения поля необходимо использовать utf8mb4. Поменять кодировку можно с помощью скрипта php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php $dbName = ‘YOUR_DB_NAME’; $user = ‘YOUR_USER_NAME’; $password = ‘YOUR_PASSWORD’; $dsn = ‘mysql:dbname=’.$dbName.‘;host=localhost’; $time_n=time(); try { $dbh = new PDO($dsn, $user, $password); } catch (PDOException $e) { exit(‘Подключение не удалось: ‘ . $e->getMessage()); } $sql = «SELECT distinct CONCAT( ‘alter table ‘, TABLE_SCHEMA, ‘.’, TABLE_NAME, ‘ CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;’ ) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ‘$dbName’;»; $arErrors = []; $cnt = 0; foreach ($dbh->query($sql) as $row) { try { $dbh->exec($row[0]); } catch (PDOException $e) { $arErrors[] = ‘Ошибка: ‘ . $e->getMessage(); } $cnt++; } $time_k=time(); echo ‘Затронуто таблиц: ‘ . $cnt . ‘ Из них с ошибками: ‘ . count($arErrors) . ‘<br>’; echo ‘Время выполнения: ‘ . strftime(‘%M:%S’,$time_k—$time_n) . ‘<br>’; if (count($arErrors) > 0) { echo ‘Список ошибок: <br>’; echo ‘<pre>’; print_r($arErrors); echo ‘</pre>’; } |
Результат выполнения скрипта:
Затем в конфигах битрикса прописать:
— в файле bitrix/php_interface/after_connect_d7.php:
$connection = \Bitrix\Main\Application::getConnection(); $connection->queryExecute(«SET NAMES ‘utf8′»); $connection->queryExecute(‘SET collation_connection = «utf8mb4_unicode_ci»‘); |
— в файле bitrix/php_interface/after_connect.php:
$DB->Query(«SET NAMES ‘utf8′»); $DB->Query(‘SET collation_connection = «utf8mb4_unicode_ci»‘); |
После, если система заработает, следеут сделать проверку системы:
Если будут ошибки, то исправить их следуя подсказкам битрикса.
Если же ошибка не исправилась, значит необходимо поиграться с вариантами кодировки. В моем случае эти действия помогли, но не с первого раза. По итогу оставил кодировку utf8 и utf8_unicode_ci, и она чудо образом стала работать. Почему до этого выпадала ошибка, для меня осталось загадкой 🙂
Сегодня зачищал PDOException: SQLSTATE: General error: 1366. Происходила ошибка при записи в базу UTF строк, содержащих неизвестные базе данных UTF символы. По логам было ясно, что и куда пытается сохранить программа.
Путей решения маячило целых два:
- «научить» базу понимать эти символы,
- убирать символы, вызывающие проблему.
Но сначала хотелось разобраться, чем одни UTF символы отличаются от других. Я не вдавался в подробности того как кодируется UTF, какие они бывают.
Оказалось, что UTF содержит символы, кодируемые последовательностью от 1 до 4 байт. Вот как они шифруются в бинарном коде:
0xxxxxxx 110xxxxx 10xxxxxx 1110xxxx 10xxxxxx 10xxxxxx 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
В моем случае проблемы с базой вызвали 4х байтные символы.
«Учим» базу
Можно поменять тип поля на BLOB, чтобы база не производила проверку валидности UTF. А можно проверить всю цепочку соединения с базой, чтобы переключиться на поддержку кодировки utf8mb4.
Лично мне, вся эта псевдографика, которая засунута в 4х-байтные таблицы utf, совершенна не нужна, потому я пойду вторым путем.
Убираем 4х-байтные символы UTF из текста
Для PHP получился вот такой шаблон для замены:
//удалить 4х-байтные символы UTF $text = preg_replace(«/[\xf0-\xf7][\x80-\xbf]{3}/», » «, $text); |
Если вдруг понадобится «почикать» 3х байтные, вот пример регулярного выражения и для него:
//удалить 3х-байтные символы UTF $text = preg_replace(«/[\xe0-\xef][\x80-\xbf]{2}/», » «, $text); |
Написать комментарий
Данная запись опубликована в 22.03.2017 19:26 и размещена в рубрике Программирование.
Вы можете перейти в конец страницы и оставить ваш комментарий.
Мало букафф? Читайте есчо !
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Активные темы Темы без ответов
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
1 2008-07-03 18:20:42
- fog!
- Редкий гость
- Неактивен
- Зарегистрирован: 2008-06-28
- Сообщений: 4
Тема: Ошибка #1366
Ошибка
SQL-запрос:
INSERT INTO `cities` ( `id` , `city_name` , `latitude` , `longitude` , `population` , `country_code` )
VALUES (
», ‘Sherbrooke’, ’45 23 59.00′, ‘-71 46 11.00’, 125000, ‘ca’
)
Ответ MySQL: Документация
#1366 — Incorrect integer value: » for column ‘id’ at row 1
Здравствуйте. Как видно из запроса — MySQL недоволен пустым значением в поле id. Но разве не так должно быть при автоматическом индексировании? При создании таблицы по отношению к полю id использовалась функция auto_increment. Кстати пример из статьи Марка Делисла, приведенной на этом сайте;).
Обьясните новичку что не так.
Заранее благодарен.
2 Ответ от Hanut 2008-07-03 21:33:31
- Hanut
- Модератор
- Неактивен
- Откуда: Рига, Латвия
- Зарегистрирован: 2006-07-02
- Сообщений: 9,726
Re: Ошибка #1366
fog!
Это не совсем ошибка, скорее уведомление о несоответствии синтаксиса стандарту. Обычно подобная ошибка не выводится, но так как сервер устанавливается в целях обучения, то при настройке MySQL был задан режим жесткого соответствия SQL запросов стандарту (Strict Mode). В конфигурационном файле MySQL за данную настройку отвечает директива sql-mode, но я бы крайне не рекомендовал ее менять.
Для соответствия стандарту запрос можно заменить двумя способами.
-- В данном случае мы вовсе убираем поле id при вставке данных.
INSERT INTO `cities` ( `city_name` , `latitude` , `longitude` , `population` , `country_code` )
VALUES ( 'Sherbrooke', '45 23 59.00', '-71 46 11.00', 125000, 'ca' );
-- Либо назначаем полю id значение NULL.
INSERT INTO `cities` ( `id` , `city_name` , `latitude` , `longitude` , `population` , `country_code` )
VALUES ( NULL, 'Sherbrooke', '45 23 59.00', '-71 46 11.00', 125000, 'ca' );
3 Ответ от fog! 2008-07-04 19:43:45
- fog!
- Редкий гость
- Неактивен
- Зарегистрирован: 2008-06-28
- Сообщений: 4
Re: Ошибка #1366
спасибо) я тоже подумал про НУЛЛ)
4 Ответ от Vital 2015-07-05 11:51:57 (изменено: Vital, 2015-07-05 12:35:50)
- Vital
- Редкий гость
- Неактивен
- Зарегистрирован: 2015-04-20
- Сообщений: 2
Re: Ошибка #1366
Добрый день, уважаемый Hanut.
Нужна помощь.
Вылезает такая же ошибка, когда пытаюсь поменять тип поля.
Сейчас поле year. Его тип CHAR. Количество символов — 4.
Меняю на тип SMALLINT с количеством символов 6 и выводится ошибка 1366.
Чем, по вашему мнению, недоволен MySQL и как попробовать его удовлетворить?
Ссылки на скрины:
https://yadi.sk/i/0-AjKqU-hfzRL
https://yadi.sk/i/vUEzb824hfzfG
https://yadi.sk/i/Se5E0TDBhfzfr
Уверен, что в очередной раз сможете помочь.
Заранее спасибо большое за помощь!!!
Сообщения 4
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться