Mysql код ошибки 1366

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: 'xF0x93x80x80' 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: 'xF0x90x8Dx83' for column 'names' at row 1

Alternatively, you can also pass the hex code (xF0x90x8Dx83 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 👍

Today I got an error while I was developing an app based on PHP, MySql and the Zend Framework. Moreover, I’m using phpseclib to encrypt the data using the AES algorithm and here came the problem. The output of the AES algorithm is in a form that seems MySql doesn’t like. Infact when I try to insert the data into the database a got an Sql Exception. The error is:

SQLSTATE[HY000]: General error: 1366 Incorrect string value: 'xE4xD5xABtZM...' for column 'Name'

I’ve already read all the answers posted on Stackoverflow and have also Googled the problem but all the proposed solution were already in my code. Database, tables and all the cols have Collation utf8_general_ci. Below you can see the relevant code:

  1. Application.ini to see how is set up the connection
  2. Database.php to see how I retrieve the database connection
  3. Model.php to see how I try to insert the data in the database
  4. encrypt() to see how I use the AES class to encrypt the data
  5. Table definition (If know that all are in utf8 isn’t enough)

application.ini

resources.db.adapter = "Pdo_Mysql"
resources.db.params.charset = "utf8"
resources.db.params.host = "localhost"
resources.db.params.username = "********"
resources.db.params.password = "********"
resources.db.params.dbname = "dbname"

database.php

public static function getDb()
{
   if (self::$Db === NULL)
      self::$Db = Zend_Db_Table::getDefaultAdapter();
   return self::$Db;
}

model.php

$Values = array(
   'Id' => $this->Id,
   'Name' => $this->Name,
   'CreationDate' => $this->CreationDate,
);
$RowChanged = $Db->insert('TABLENAME', $Values);

encrypt()

public static function encrypt($Data, $EncryptionKey)
{
   $AES = new Crypt_AES();
   $AES->setKey($EncryptionKey);
   return $AES->encrypt($Data);
}

table

CREATE TABLE IF NOT EXISTS `table` (
  `Id` mediumint(8) unsigned NOT NULL,
  `Name` varchar(200) DEFAULT NULL,
  `CreationDate` date NOT NULL,
  PRIMARY KEY (`Id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Question: How can I solve the problem and store the data into the database?

I have been looking everywhere for an answer, but I still have not found a solution.
Background:
I have a MySQL Server 5.5 running on my computer for testing data that will be eventually loaded into a Production Server for my company. I created the database in MySQL Workbench and have edited it where appropriate to fit my data as I loaded it. My data is nowhere near clean, so for the most part I am using VARCHAR for my fields, since a whole bunch of random things can be put into the field. I have tried changing multiple things and I am no longer sure whether anything I have done has fixed or even helped to eliminate the issue at all.

My Code:
DB Creation:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

SET NAMES utf8;

DROP SCHEMA IF EXISTS `mydb` ;
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`Customer_Account`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Customer_Account` ;

CREATE TABLE IF NOT EXISTS `mydb`.`Customer_Account` (
  `idCustomer_Account` VARCHAR(20) NOT NULL,
  `Name` VARCHAR(130) NOT NULL,
  `Billing_Street` VARCHAR(150) NULL,
  `Billing_City` VARCHAR(30) NULL,
  `Billing_StateProvince` VARCHAR(25) NULL,
  `Billing_PostalCode` VARCHAR(15) NULL,
  `Billing_Country` VARCHAR(20) NULL,
  `Location_Type` VARCHAR(15) NULL,
  `Parent_ID` VARCHAR(20) NULL,
  `Parent_Name` VARCHAR(130) NULL,
  PRIMARY KEY (`idCustomer_Account`),
  UNIQUE INDEX `idCustomer_Account_UNIQUE` (`idCustomer_Account` ASC))
ENGINE = InnoDB DEFAULT CHARSET=utf8;

  'CONSTRAINT `Parent_ID`
    FOREIGN KEY (`idCustomer_Account`)
    REFERENCES `mydb`.`Customer_Account` (`idCustomer_Account`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)'

-- -----------------------------------------------------
-- Table `mydb`.`Customer_Address`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Customer_Address` ;

CREATE TABLE IF NOT EXISTS `mydb`.`Customer_Address` (
  `idCustomer_Address` VARCHAR(20) NOT NULL,
  `Name` VARCHAR(50) NOT NULL,
  `Name_Int` INT,
  `Address` VARCHAR(80) NULL,
  `City` VARCHAR(30) NULL,
  `State` VARCHAR(5) NULL,
  `ZIP` VARCHAR(15) NULL,
  `LinkedAccount_Name` VARCHAR(100) NULL,
  `LinkedAccount_ID` VARCHAR(20) NULL,
  `CADD` INT,
  PRIMARY KEY (`idCustomer_Address`),
  UNIQUE INDEX `idCustomer_Address_UNIQUE` (`idCustomer_Address` ASC))
ENGINE = InnoDB DEFAULT CHARSET=utf8;

-- -----------------------------------------------------
-- Table `mydb`.`Contacts`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Contacts` ;

CREATE TABLE IF NOT EXISTS `mydb`.`Contacts` (
  `idContacts` VARCHAR(20) NOT NULL,
  `Name` VARCHAR(50) NOT NULL,
  `Title` VARCHAR(130) NULL,
  `Mailing_Street` VARCHAR(110) NULL,
  `Mailing_City` VARCHAR(30) NULL,
  `Mailing_State` VARCHAR(25) NULL,
  `Mailing_PostalCode` VARCHAR(20) NULL,
  `Phone` VARCHAR(50) NULL,
  `Account_ID` VARCHAR(20) NULL,
  `Account_Name` VARCHAR(100) NULL,
  PRIMARY KEY (`idContacts`),
  UNIQUE INDEX `idContacts_UNIQUE` (`idContacts` ASC))
ENGINE = InnoDB DEFAULT CHARSET=utf8;


-- -----------------------------------------------------
-- Table `mydb`.`Contact_Details`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Contact_Details` ;

CREATE TABLE IF NOT EXISTS `mydb`.`Contact_Details` (
  `idContact_Details` VARCHAR(20) NOT NULL,
  `Salutation` VARCHAR(70) NULL,
  `First_Name` VARCHAR(30) NULL,
  `Last_Name` VARCHAR(50) NULL,
  `Title` VARCHAR(130) NULL,
  `Mailing_Street` VARCHAR(175) NULL,
  `Mailing_City` VARCHAR(50) NULL,
  `Mailing_StateProvince` VARCHAR(30) NULL,
  `Mailing_PostalCode` VARCHAR(20) NULL,
  `Mailing_Country` VARCHAR(25) NULL,
  `Phone` VARCHAR(50) NULL,
  `Mobile` VARCHAR(35) NULL,
  `Fax` VARCHAR(45) NULL,
  `Email` VARCHAR(75) NULL,
  `Email_OptOut` VARCHAR(1) NULL,
  `Account_Owner` VARCHAR(20) NULL,
  `Account_Name` VARCHAR(125) NULL,
  `Account_ID` VARCHAR(20) NOT NULL,
  `Active` VARCHAR(2) NOT NULL,
  PRIMARY KEY (`idContact_Details`),
  UNIQUE INDEX `idContact_Details_UNIQUE` (`idContact_Details` ASC))
ENGINE = InnoDB DEFAULT CHARSET=utf8;

'INDEX `Account_ID_idx` (`Account_ID` ASC)'

-- -----------------------------------------------------
-- Table `mydb`.`WF1_SR_Accounts`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`WF1_SR_Accounts` ;

CREATE TABLE IF NOT EXISTS `mydb`.`WF1_SR_Accounts` (
  `idWF1_SR_Accounts` VARCHAR(20) NOT NULL,
  `Name` VARCHAR(125) NOT NULL,
  `Billing_Street` VARCHAR(135) NULL,
  `Billing_City` VARCHAR(50) NULL,
  `Billing_State` VARCHAR(20) NULL,
  `Billing_PostalCode` VARCHAR(20) NULL,
  `Billing_Country` VARCHAR(25) NULL,
  `Location_Type` VARCHAR(20) NULL,
  `Parent_ID` VARCHAR(20) NULL,
  `Parent_Name` VARCHAR(125) NULL,
  `SR_Account?` VARCHAR(5) NULL,
  `WF1_Account?` VARCHAR(5) NULL,
  `WF1_AccountNum` VARCHAR(10) NULL,
  `WF1_AccountStatus` VARCHAR(25) NULL,
  `WF1_AccountCreated` VARCHAR(50) NULL,
  `WF1_BU` VARCHAR(10) NULL,
  `WF1_Collector` VARCHAR(20) NULL,
  `WF1_CreditHold` VARCHAR(5) NULL,
  `WF1_CreditLimit` VARCHAR(10) NULL,
  `WF1_CreditRating` VARCHAR(15) NULL,
  `WF1_DVP` VARCHAR(20) NULL,
  `WF1_PaymentTerms` VARCHAR(20) NULL,
  `WF1_RSD` VARCHAR(40) NULL,
  `WF1_TerritoryName` VARCHAR(45) NULL,
  `WF1_TerritoryNumber` VARCHAR(5) NULL,
  `Select_` VARCHAR(5) NULL,
  `New_Select` VARCHAR(5) NULL,
  `CRMFusion_Use` VARCHAR(10) NULL,
  `CRMFusion_Change` VARCHAR(10) NULL,
  PRIMARY KEY (`idWF1_SR_Accounts`),
  UNIQUE INDEX `idWF1_SR_Accounts_UNIQUE` (`idWF1_SR_Accounts` ASC))
ENGINE = InnoDB DEFAULT CHARSET=utf8;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Note: I have also substituted latin1 for utf8 in SET NAMES, DEFUALT CHARSET, and CHARACTER_SET_SERVER, and tried to make my .txt files of both encryption types.

I also ran

SHOW VARIABLES like 'char%';

and this is my result:

Variable_name                   Value
character_set_client            latin1
character_set_connection            latin1
character_set_database          utf8
character_set_filesystem            binary
character_set_results           latin1
character_set_server            latin1
character_set_system            utf8
character_sets_dir            C:Program FilesMySQLMySQL Server 5.5sharecharsets

Note: at one point, everything but filesystem and server were utf8 and it did not work either.

I have also changed the encryption type in excel and notepad++ and changing that did not seem to help.

предисловие

Ошибка: Ошибка 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:[email protected](localhost:3306)/local_db?charset=utf8mb4  Чтобы облегчить модификацию, я ее разобрал. Мы часто устанавливаем значение utf8 в конце и часто игнорируем это, что делает невозможным использование кода для вставки выражений эмодзи👿! Просто измените его на utf8mb4.

Во-вторых, база данных

По этому вопросу существует множество учебных пособий, в целом, существует четыре уровня кодирования базы данных.

  1. Сервер базы данных
  2. Библиотека
  3. стол
  4. поле

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 или другие типы символов, вы можете выбрать соответствующий набор символов ниже

подводить итоги

Мы склонны игнорировать некоторые незначительные детали, но иногда именно эти детали разрушают все здание!

I am facing issues with my table structure :

My_Table_Name1

CREATE TABLE `My_Table_Name1` (
  `twitter_id_str` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `twitter_screen_name` varchar(512) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  UNIQUE KEY `twitter_id_str` (`twitter_id_str`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci 

For database I also have same charset and collation:

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

I’m trying to insert an emoji into this table:

insert into My_Table_Name1 values("2","😀") 

However, I get an error:

Error Code: 1366. Incorrect string value: ‘xF0x9Fx98x80’ for column ‘twitter_screen_name’ at row 1 0.00027 sec

How to solve this?

Thanks in advance.

dbdemon's user avatar

dbdemon

6,1614 gold badges18 silver badges37 bronze badges

asked May 11, 2018 at 11:51

RAJ KASHWAN's user avatar

5

The problem appears to be in the Client.

When the client connects to the MySQL server, it needs to announce that the bytes in the client are utf8mb4. This can be done in several ways:

  • In the connection parameters (client-dependent).
  • SET NAMES utf8mb4.

U+1F600 is the Unicode representation for that Emoji.
xF0x9Fx98x80 is the equivalent Hex.
F09F9880 is the UTF-8 (utf8mb4) in Hex.

Avoid the Unicode representation.

answered May 24, 2018 at 23:28

Rick James's user avatar

Rick JamesRick James

75k5 gold badges44 silver badges106 bronze badges

This seems like a problem with mysql-workbench (tested with version 6.3.9 on Fedora and MySQL 5.7 (CentOS)) where emojis are not converted to the correct unicode.

In the command-line mysql client the emojis get converted to codes when they’re pasted in, so the query

INSERT INTO My_Table_Name1 values("2","😀"); 

becomes:

INSERT INTO My_Table_Name1 values("4","U+1F600");

which works fine.

However, in mysql-workbench, the emoji is not converted as you paste it in, and the query result is:

Error Code: 1366. Incorrect string value: ‘xF0x9Fx98x80’ for column ‘twitter_screen_name’ at row 1

answered May 12, 2018 at 16:28

dbdemon's user avatar

dbdemondbdemon

6,1614 gold badges18 silver badges37 bronze badges

  • Mysql workbench ошибка 1452
  • Mysql workbench ошибка 1064
  • Mysql server ошибка установки
  • Mysql server ошибка при установке
  • Mysql num rows ошибка