Lỗi 1366 for column cat_id at row 1 trong mysql năm 2024

I've noticed that now when I display a table that includes the id as a column and I enter a new record with Editor, I get the following error:

An SQL error occurred: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'id' at row 1

I do not get this error for an edit or delete action.

My guess is that Editor's insert SQL statement includes the id because I show it in a column and uses an empty string instead of a null on the insert statement. MySQL 5.7's STRICT mode flags the empty string as an incorrect integer value, since it's not an integer.

Một mặt, việc chèn biểu tượng cảm xúc vào bảng cơ sở dữ liệu MySQL/MariaDB không yêu cầu bất kỳ bước chuẩn bị đặc biệt nào – chỉ cần chèn một hoặc nhiều ký tự biểu tượng cảm xúc, có thể chứa văn bản khác. Ví dụ:

INSERT INTO TestTABLE (test_column) VALUES ("🎫⏭️✈️ and hi 🌅");

Nhưng khi thực hiện yêu cầu trước đó, bạn có thể gặp lỗi:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

Lỗi 1366 for column cat_id at row 1 trong mysql năm 2024

Tại sao xảy ra “ERROR 1366 (22007): Giá trị chuỗi không chính xác”

Biểu tượng cảm xúc là các ký tự sử dụng bốn byte mã hóa UTF-8. Xin nhắc lại, UTF-8 là mã hóa có độ dài thay đổi và MySQL/MariaDB cho phép bộ ký tự utf8mb3 và utf8mb4 sử dụng 3 và 4 byte cho mỗi điểm mã tương ứng .

Hiện nay, utf8mb3 được coi là một bộ ký tự lỗi thời và khi tạo cơ sở dữ liệu cũng như bảng, bạn chỉ nên sử dụng bộ ký tự utf8mb4.

Xem bài viết để biết chi tiết: Sự khác biệt giữa các đối chiếu utf8_general_ci, utf8_unicode_ci, utf8mb4_general_ci, utf8mb4_unicode_ci. Lựa chọn đối chiếu, bộ ký tự và mã hóa nào cho cơ sở dữ liệu MySQL

Cách sửa lỗi “ERROR 1366 (22007): Giá trị chuỗi không chính xác”

  1. Để lưu trữ văn bản có chứa biểu tượng cảm xúc, bạn không chỉ phải chọn bảng mã UTF-8 mà còn phải chọn bộ ký tự utf8mb4. Điều này phải được thực hiện cho toàn bộ cơ sở dữ liệu cũng như các bảng và cột.
  2. Nếu cơ sở dữ liệu sử dụng utf8mb4, thì ngay cả trong trường hợp này cũng cần phải chỉ định bộ ký tự chính xác trong thuộc tính kết nối máy chủ MySQL/MariaDB.

Tất cả những vấn đề này sẽ được thảo luận chi tiết hơn dưới đây.

Cách kiểm tra cơ sở dữ liệu và bảng đó bằng bộ ký tự utf8mb4

Để kiểm tra bộ ký tự nào cơ sở dữ liệu đang sử dụng, hãy chạy truy vấn như thế này (thay thế _TestDB_ bằng tên của cơ sở dữ liệu):

SHOW CREATE DATABASE TestDB;

Đầu ra mẫu:

CREATE DATABASE TestDB /!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci /

Lỗi 1366 for column cat_id at row 1 trong mysql năm 2024

Như bạn có thể thấy, bộ ký tự được đặt thành utf8mb4 và đối chiếu được đặt thành utf8mb4_unicode_ci. Điều này tốt. Nhưng trên thực tế, các bảng có thể sử dụng bộ ký tự riêng. Hơn nữa, ngay cả các cột riêng lẻ của cùng một bảng cũng có thể có các giá trị riêng cho bộ ký tự được sử dụng.

Trong thực tế, tôi đã gặp phải thực tế là cơ sở dữ liệu được tạo bằng bộ ký tự utf8 và đối chiếu utf8_unicode_ci, nhưng điều này không ngăn cản việc nhập các bảng bằng bộ ký tự >utf8mb4 và đối chiếu utf8mb4_unicode_ci. Vậy thì việc lựa chọn bộ ký tự bảng và cơ sở dữ liệu sẽ ảnh hưởng như thế nào nếu những giá trị này có thể bị ghi đè cho từng cột riêng lẻ? Điều này đối với tôi không hoàn toàn rõ ràng, có lẽ dữ liệu này được sử dụng làm giá trị mặc định khi tạo bảng mới.

Để kiểm tra xem bảng đang sử dụng bộ ký tự nào, hãy chạy truy vấn như thế này (thay thế _TestTABLE_ bằng tên bảng :):

SHOW CREATE TABLE TestTABLE;

Đầu ra mẫu:

CREATE TABLE TestTABLE ( id int(11) NOT NULL AUTO_INCREMENT, test_column text NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Lỗi 1366 for column cat_id at row 1 trong mysql năm 2024

Bộ ký tự mặc định là utf8mb4. Điều này có nghĩa như sau:

  • các cột cũng nên sử dụng bộ ký tự utf8mb4 nếu điều này không thay đổi kể từ khi bảng được tạo
  • một cái bàn như vậy có thể lưu trữ biểu tượng cảm xúc

Cách thay đổi bộ ký tự của bảng và các trường trong bảng thành utf8mb4

Nếu bộ ký tự không phải là utf8mb4 (ví dụ: utf8 hoặc thứ gì khác được sử dụng), thì trước tiên bạn có thể đặt bộ ký tự thành utf8mb4 đối với toàn bộ cơ sở dữ liệu, việc này được thực hiện bằng một truy vấn như:

ALTER DATABASE TestDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

Mặc dù, như đã đề cập ở trên, điều này không ảnh hưởng đặc biệt đến nội dung của các bảng đã được tạo.

Để thay đổi bộ ký tự mặc định của bảng, cũng như bộ ký tự được sử dụng của tất cả các cột văn bản (CHAR, VARCHAR, TEXT) thành một bộ ký tự mới, hãy sử dụng biểu thức như thế này (thay thế _TestTABLE_ bằng tên bảng):

ALTER TABLE TestTABLE CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Câu lệnh này cũng thay đổi sự đối chiếu của tất cả các cột ký tự.

Vì vậy, việc thay đổi bộ ký tự của các cột riêng lẻ thành utf8mb4 là không cần thiết. Nhưng bạn có thể làm điều đó, bao gồm cả việc tránh tự động chuyển đổi kiểu dữ liệu cột.

Đối với cột có kiểu dữ liệu VARCHAR hoặc một trong các loại TEXT, CONVERT TO CHARACTER SET sẽ thay đổi kiểu dữ liệu nếu cần để đảm bảo rằng cột mới đủ dài để lưu trữ nhiều ký tự như cột ban đầu. Ví dụ: cột TEXT có hai byte độ dài lưu trữ độ dài byte của các giá trị trong cột, tối đa là 65.535. Đối với cột latin1 TEXT, mỗi ký tự yêu cầu một byte đơn, do đó cột có thể lưu trữ tối đa 65.535 ký tự. Nếu cột được chuyển đổi thành utf8mb4 thì mỗi ký tự có thể yêu cầu tối đa 4 byte, với độ dài tối đa có thể là 4 × 65.535=262.140 byte. Độ dài đó không vừa với byte độ dài của cột TEXT, do đó MySQL chuyển đổi kiểu dữ liệu thành MEDIUMTEXT, đây là loại chuỗi nhỏ nhất mà byte độ dài có thể ghi một giá trị trong số 262.140. Tương tự, cột VARCHAR có thể được chuyển đổi thành MEDIUMTEXT.

Để tránh những thay đổi kiểu dữ liệu thuộc loại vừa mô tả, không sử dụng CHUYỂN ĐỔI SANG BỘ KÝ TỰ. Thay vào đó, hãy sử dụng MODIFY để thay đổi các cột riêng lẻ. Ví dụ:

ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8mb4; ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M) CHARACTER SET utf8mb4;

Cách tạo bảng bằng bộ ký tự utf8mb4

Để tạo bảng và các cột ký tự của bảng, hãy sử dụng utf8mb4, hãy thêm dòng sau vào truy vấn tạo bảng:

DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

Ví dụ:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

0

Cơ sở dữ liệu và bảng đang sử dụng utf8mb4 nhưng vẫn xảy ra lỗi “ERROR 1366 (22007): Inexpected string value”

Nếu mọi thứ đều ổn với cơ sở dữ liệu và dữ liệu được lưu trữ trong đó thì trước khi thực hiện các truy vấn bao gồm biểu tượng cảm xúc, hãy chạy truy vấn sau:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

1

Câu lệnh này đặt ba biến hệ thống phiên: character_set_client, character_set_connection và character_set_results thành bộ ký tự được chỉ định.

Như bạn có thể thấy, lỗi đã biến mất.

Lỗi 1366 for column cat_id at row 1 trong mysql năm 2024

Chúng tôi có thể xác minh rằng dữ liệu mới thực sự được chèn vào bảng:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

2

Lưu ý: biểu tượng cảm xúc trong bảng điều khiển có thể không được hiển thị chính xác – rõ ràng, điều này là do đặc thù của thiết bị đầu cuối hoặc thiếu phông chữ cần thiết. Tuy nhiên, mặc dù thực tế là trong ảnh chụp màn hình, các biểu tượng cảm xúc dường như bò chồng lên nhau và một số biểu tượng cảm xúc đơn giản là không hiển thị chính xác, nhưng trong trình duyệt web hoặc trình soạn thảo văn bản, chúng trông vẫn chính xác.

Cách đặt bộ ký tự mặc định trong cài đặt

Bạn có thể chỉ định bộ ký tự mặc định trong dòng lệnh bằng tùy chọn --default-character-set. “Bộ ký tự mặc định” có nghĩa là mã hóa được chỉ định sẽ được sử dụng trừ khi nó bị các truy vấn khác ghi đè.

Một ví dụ về các lệnh để kết nối với máy chủ MySQL và MariaDB, trong trường hợp đó kết nối sẽ sử dụng bộ ký tự utf8mb4:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

3

Nếu bạn muốn luôn sử dụng bộ ký tự utf8mb4 nhưng không muốn luôn truy vấn hoặc chỉ định nó trong dòng lệnh thì bạn có thể chọn bộ ký tự mặc định trong tệp cấu hình.

Để thực hiện việc này, hãy mở tệp /etc/my.cnf:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

4

Và thêm các dòng sau vào đó:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

5

Xem thêm: Cách xác định vị trí và tên của tệp cấu hình MySQL (MariaDB). Cách tìm tên nhóm cho tệp cấu hình MySQL và MariaDB

Bạn có thể xác minh rằng cài đặt này thực sự có hiệu lực bằng lệnh sau:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

6

Kết quả sẽ là giá trị của biến môi trường default-character-set:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

7

Làm cách nào để biết ký tự nào gây ra “ERROR 1366 (22007): Giá trị chuỗi không chính xác”

Có lẽ bạn không muốn thay đổi bất cứ điều gì trong cơ sở dữ liệu hoặc trong kết nối với DBMS, khi đó, để thay thế, bạn có thể xóa ký tự vấn đề khỏi văn bản.

Hãy xem xét lỗi:

ERROR 1366 (22007): Incorrect string value: '\xF0\x9F\x8E\xAB\xE2\x8F...' for column TestDB1.TestTABLE.test_column at row 1

Phần chuỗi có các giá trị bắt đầu bằng “\x” là biểu diễn thập lục phân của biểu tượng cảm xúc (hoặc ký tự 4 byte khác). Việc các byte nhiều hơn bốn cho thấy có một số ký tự biểu tượng cảm xúc. Để xem ký tự đầu tiên, hãy sao chép bốn byte đầu tiên và chạy lệnh như sau: