Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Активные темы Темы без ответов
Страницы 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
Чтобы отправить ответ, вы должны войти или зарегистрироваться
When you try to insert a new record into your MySQL database table, you may encounter an error saying Incorrect string value
along with some UTF-8 hex code for the description.
For example, suppose you create a Test
table with only one column as follows:
CREATE TABLE `Test` (
`names` varchar(255)
)
Next, let’s insert the following Egyptian hieroglyph character into the table:
INSERT INTO Test VALUES('𓀀');
Your MySQL server may respond with the following error:
ERROR 1366 (HY000):
Incorrect string value: '\xF0\x93\x80\x80' for column 'names' at row 1
The error above is because the character 𓀀
requires 4-bytes to be represented in UTF-8 encoding.
By default, MySQL databases and tables are created using a UTF-8 with 3-bytes encoding. You can see the encoding used for your table by using the SHOW CREATE TABLE
statement as follows:
SHOW CREATE TABLE Test \G
Here’s the result from my computer:
*************************** 1. row ***************************
Table: Test
Create Table: CREATE TABLE `Test` (
`names` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
As you can see, the table uses the DEFAULT CHARSET=utf8mb3
and the names
column uses CHARACTER SET utf8
.
The MySQL utf8
or utf8mb3
can’t store string values that contain a UTF-8 4-bytes character.
To store the values, you need to use the utf8mb4
character set.
Here’s the query to alter your database, table, or column to utf8mb4
character set:
-- Change a database
ALTER DATABASE [database_name]
CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- Change a table
ALTER TABLE [table_name]
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- Change a column
ALTER TABLE [table_name]
CHANGE [column_name] [column_name] VARCHAR(255)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
When you change the character set on the database level, then any new table you create for that database in the future will use that character set as the default encoding.
Returning to the Test
table, you can alter just the names
column to make the INSERT
statement works:
ALTER TABLE `Test`
CHANGE `names` `names` VARCHAR(255)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Now you should be able to insert the character 𓁴
into the table:
INSERT INTO Test VALUES('𓁴');
-- Query OK, 1 row affected (0.00 sec)
By default, MySQL version 8 should use utf8mb4
encoding and collation for your databases. If you see utf8
or utf8mb3
, then you might be using MySQL version below 8 (MySQL version 5 may default to utf8mb3
).
When you encounter this error, pay attention to the characters that you want to insert into the database.
They may look like normal characters, but if you copy and paste them from some source, then they may have a strange encoding attached to them.
For example, the GOTHIC LETTER SAUIL 𐍃
looks like a normal capital S
but actually a 4-bytes
character:
INSERT INTO Test VALUES('𐍃');
ERROR 1366 (HY000):
Incorrect string value: '\xF0\x90\x8D\x83' for column 'names' at row 1
Alternatively, you can also pass the hex code (\xF0\x90\x8D\x83
in the example above) into Google to look for the exact character that causes the error.
To conclude, the ERROR 1366: Incorrect string value
happens when MySQL can’t insert the value you specified into the table because of incompatible encoding.
You need to modify or remove characters that have 4-bytes
UTF-8 encoding, or you can change the encoding and collation used by MySQL.
Note that utf8
in MySQL always refers to utf8mb3
.
To use the 4-bytes
UTF-8 encoding, it needs to be specified as utf8mb4
.
With this information, you should now be able to resolve this error. Feel free to use the provided ALTER
statements above if you need it 👍
предисловие
Ошибка: Ошибка 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 или другие типы символов, вы можете выбрать соответствующий набор символов ниже
подводить итоги
Мы склонны игнорировать некоторые незначительные детали, но иногда именно эти детали разрушают все здание!
Вот мой sql:
INSERT INTO comments (createdate,userid,profileid,comment,status)
VALUES (1449503167,65704,65704,'@Mr_S66 Wish I was There For The Xmas Party I Miss My Studio 66 Family 😜',15)
Здесь моя схема комментариев:
+------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+----------------+
| commentid | int(11) | NO | PRI | NULL | auto_increment |
| parentid | int(11) | YES | | 0 | |
| refno | int(11) | YES | | 0 | |
| createdate | int(11) | YES | | 0 | |
| remoteip | varchar(80) | YES | | | |
| locid | int(11) | YES | MUL | 0 | |
| clubid | int(11) | YES | | 0 | |
| profileid | int(11) | YES | MUL | 0 | |
| userid | int(11) | YES | MUL | 0 | |
| legacyuser | int(11) | YES | MUL | 0 | |
| mediaid | int(11) | YES | | 0 | |
| status | int(11) | YES | | 1 | |
| comment | varchar(4000) | YES | | | |
| likes | int(11) | YES | | 0 | |
| dislikes | int(11) | YES | | 0 | |
| import | int(11) | YES | | 0 | |
| author | varchar(50) | YES | | | |
+------------+---------------+------+-----+---------+----------------+
Вот мой вывод sql query
:
ERROR 1366 (HY000): неправильное строковое значение: ‘\ xF0\x9F\x98\x9C’ для столбца ‘comment’ в строке 1
Не совсем уверен, как это решить. Возможно, фильтр текста комментария using php
для размещения строкового значения.
Поделиться
Источник
4 ответа
Что-то в вашей среде не настроено правильно обрабатывать текст Unicode.
Последовательность байтов F0 9F 98 9C
, представленная неверно как «ðŸ~œ» в вашем запросе, представляет собой кодировку UTF8 символа Unicode «», FACE WITH STUCK-OUT TONGUE AND WINKING EYE. (То есть, это символ эмози.)
Чтобы правильно сохранить этот символ, вам необходимо убедиться, что:
- Вы активируете UTF8 в своем соединении MySQL (т.е.
SET NAMES utf8mb4
или используйте параметр при подключении, который аналогичным образом включает его). - Вы используете MySQL 5.5 или новее.
- Ваш набор символов таблицы
utf8mb4
.
duskwuff
Поделиться
Измените подключение к mysql из SET NAMES utf8, чтобы установить NAMES utf8mb4
thelightings
Поделиться
Измените соединение с mysql с «SET NAMES utf8» на «SET NAMES utf8mb4»
В PHP используйте mysqli_set_charset для добавления charset,
https://www.w3schools.com/php/func_mysqli_set_charset.asp
$conn = mysqli_connect("localhost","my_user","my_password","my_db");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
// Change character set to utf8
mysqli_set_charset($conn, "utf8mb4");
Или, если вы находитесь в NodeJS (это дополнительная информация, на всякий случай)
db_config = {
host: "localhost",
user: "user",
password: "password",
database: "mydb",
charset: "utf8mb4_unicode_ci"
}
var conn = mysql.createConnection(db_config)
Кроме того, убедитесь, что столбец таблицы и сама таблица имеют одинаковую кодировку uf8mb4.
ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4;
ALTER TABLE my_table
CHANGE COLUMN my_column my_column TEXT
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Sujay Kumar
Поделиться
Ещё вопросы
- 0Предотвращение дублирования инициализации асинхронных служб в Angular.js
- 0Включая собственный шрифт по HTML
- 0почему я получаю .. это не функция?
- 1селен питон не может определить идентификатор или имя
- 1объект цепочки исключений в JAVA
- 0Расширение помощника Codeigniter
- 0Написать Html Img ID с помощью JavaScript
- 0ОШИБКА 1055 (42000): Выражение № 1 списка SELECT отсутствует в предложении GROUP BY … это несовместимо с sql_mode = only_full_group_by [duplicate]
- 0Разбор поплавка для карт Google с использованием Javascript / jQuery
- 0Qt 4.8.4 Релизная версия не работает на 64-битной Windows 7
- 1Как вы конвертируете несколько вложенных циклов в лямбду или linq, если у вас сложная структура объекта?
- 0Как мне выполнить автозагрузку классов композитора только после того, как прежней функции автозагрузки не удалось найти загружаемый класс?
- 0Удалить отступ между вкладкой 2 jquery
- 0AngularJS $ state.go нет перенаправления с ExpressJS
- 0Как очистить ng-repeat перед фильтрацией
- 0Способы передачи информации из PHP в JQUERY?
- 0мгновенный поиск без раскрывающегося списка с помощью jquery ui
- 1Как получить разные цвета для разных диапазонов значений в простых линейных графиках Google?
- 0JQuery строка для номера обратно в строку
- 0Как использовать Set with Group by в MySQL?
- 1Android — сопоставить родительский элемент при просмотре видео
- 1AndroidAnnotations + Instant App — сгенерированный класс <applicationId> .R не найден
- 0Почему и когда использовать transclusion в AngularJS
- 0установить фокус, нажав на элемент, но исключая некоторые дочерние элементы
- 0Возвращаемый массив JS на основе сравнения двух массивов с вложенными элементами
- 0Завершающее регулярное выражение со специфическим символом при первом появлении
- 0JQuery Назначение разницы ширины для элементов <li>
- 1Как настроить ESLint, чтобы он запрещал экспорт по умолчанию
- 0Композитор не найден
- 1Изменение фонового изображения при прокрутке
- 1Запустите процесс / URI из IIS в сеансе рабочего стола
- 0Доступ к свойствам и методам класса из события onclick
- 0Как привязать угловую директиву с помощью ng-repeat к Owl Carousel
- 0Значение переменной $ scope не обновляется в контроллере Angular JS?
- 1Python GUI, который поддерживает интерфейс как CSS & HTML?
- 1Как разбить массив байтов
- 1видео не воспроизводится на Android (Chrome) и iOS (Safari)
- 1Фрагменты ConstraintLayout вырезаны в FrameLayout активности
- 0Продолжительность видео HTML5
- 0Причудливая шкатулка с URL
- 0Изменение фона тела при наведении на ссылку
- 0MYSQL Сложный оператор выбора запроса
- 1Скачать APK файл из Google Play Developer Console программным способом
- 0Расчет итогов для строк и столбцов в дизайнере отчетов Pentaho
- 0Предупреждение: preg_match () [function.preg-match]: без конечного разделителя ‘^
- 0Чтобы получить экземпляр li с выбранным значением в его div, используя JQuery
- 0Динамически применять атрибуты к элементам DOM в ngRepeat в директиве
- 0Каскадное выпадающее выбранное значение
- 1SoftKeyboard накладывается на EditText — ConstraintLayout
- 0Jquery children () прозрачность анимации
Мне нужно сохранить пользовательский агент посетителя.
Это мой фрагмент:
// User Agent
$ua = $_SERVER['HTTP_USER_AGENT']??'';
$ua_md5 = md5($ua);
// Search if the UA already exists in the user_agents table
$ua_id = $db->query("SELECT id FROM user_agents WHERE md5='".$ua_md5."';")->fetchColumn();
if(!$ua_id) {
// If it doesn't exist, insert it and get its id
$db->query("INSERT INTO user_agents (md5, user_agent) VALUES ('$ua_md5', ".$db->quote($ua).")");
$ua_id = $db->lastInsertId();
}
Я использую PDO: quote вместо подготовленных операторов только по соображениям производительности (это быстрее, и этот скрипт выполняется тысячи раз в секунду).
Бывает, что у некоторых пользователей есть этот пользовательский агент:
Mozilla / 5.0 (Linux; Android 5.0; \ xD6wn Smart Build / LRX21M) AppleWebKit / 537.36 (KHTML, как Gecko) Версия / 4.0 Chrome / 37.0.0.0 Mobile Safari / 537.36
И вставка терпит неудачу для этой ошибки:
«Сообщение PHP: SQLSTATE [HY000]: общая ошибка: 1366 Неверное строковое значение:« \ xD6wn Sm … »для столбца« user_agent »в строке 1» при чтении заголовка ответа из восходящего потока
В чем причина и как это можно исправить?
Изменить: больше отладки выяснил $ua
значение:
Mozilla / 5.0 (Linux; Android 5.0; ÖWN S1 Build / LRX21M) AppleWebKit / 537.36 (KHTML, как Gecko) Версия / 4.0 Chrome / 37.0.0.0 Mobile Safari / 537.36
2
Решение
Прежде всего, когда речь идет о проблемах кодирования, всегда необходимо проверять необработанные байты и никогда не полагаться на выходные данные какого-либо процесса, который обрабатывает или интерпретирует входные данные. В случае с PHP, var_dump () всегда хорошая отправная точка, но вам также нужно сбросить в гекс или даже прибегнуть к шестнадцатеричный редактор:
<?php
var_dump(bin2hex($_SERVER['HTTP_USER_AGENT']));
Мое обоснованное предположение (и я не верю, что это слишком далеко от истины) таково:
-
Некоторый браузер Android отправляет заголовок HTTP, который включает
Öwn Smart Build
закодировано в ISO-8859-1, гдеÖ
ака «ПИСЬМО ЛАТИНСКОГО КАПИТАЛА O С ДИАРЕЗОМ» (U + 00D6) кодируется какD6
, -
Стек вашего приложения настроен для UTF-8 (разумный выбор), где
Ö
будет закодирован какC396
, -
PHP не знает / заботится, потому что строки PHP не поддерживают кодирование (они просто потоки байтов).
-
MySQL обрабатывается
D6
Говорят, что это UTF-8 (но это не так). -
Имел
D6
Если бы действительный символ UTF-8 (другой) или часть (другой) многобайтовой последовательности, вставка была бы завершена с незначительной потерей данных (оригиналÖwn
текст был бы потерян и заменен чем-то другим). Хорошо это или плохо, это недопустимый UTF-8, поэтому MySQL прерывает вставку с сообщением об ошибке, которое вы описываете.
Почему MySQL не может справиться с этим? Давайте проверим UTF-8 определение:
Nr of
Bytes Byte 1 Byte 2 Byte 3 Byte 4
1 0xxxxxxx
2 110xxxxx 10xxxxxx
3 1110xxxx 10xxxxxx 10xxxxxx
4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Оригинальная латиница-1 Öw
текст закодирован как D6 77
который в переводе на двоичный:
11010110 01001101
^^^ ^^
В UTF-8, 110…
означает «Начало двухбайтового символа». Второй байт должен начинаться с 10…
но у нас есть 01…
вместо. К сожалению!
Как вы можете решить это? Это сложнее, чем кажется. Если бы вы могли точно знать, что ввод ISO-8859-1, это просто прямое преобразование:
<?php
$input = "\xD6wn";
$output = mb_convert_encoding($input, 'UTF-8', 'ISO-8859-1');
var_dump(bin2hex($input), bin2hex($output));
string(6) "d6776e"string(8) "c396776e"
(Онлайн демо)
Но как ты можешь знать? Я не уверен, позволяет ли заголовок User-Agent MIME закодированные слова и даже там, браузер может просто отправлять неверные данные в любом случае. Возможно, вы можете поймать ошибку (MySQL код ошибки 1366 ака ER_TRUNCATED_WRONG_VALUE_FOR_FIELD выглядит достаточно точно) и попробуйте снова, предполагая ISO-8859-1. И, вероятно, это также хорошая идея, чтобы убедиться, что входные данные являются действительными UTF-8, хотя это может усложнить обработку:
<?php
$latin1 = "\xD6wn";
$utf8 = "\xc3\x96wn";
var_dump(mb_check_encoding($latin1, 'UTF-8'));
var_dump(mb_check_encoding($utf8, 'UTF-8'));
bool(false) bool(true)
(Онлайн демо)
3
Другие решения
Других решений пока нет …