Thỉnh thoảng khi lập trình thường gặp trường hợp không thể lưu dữ liệu vào CSDL, tra lỗi thì bị báo lỗi sau:
SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xF0\x9F\x98\x8A V...' for column
Lỗi này thường gặp khi chèn text có ký tự vượt ngoài phạm vi cho phép ví dụ lưu vào CSDL emoji như 😂🤣😃😁😀😊 sau đây là các bước thử lỗi:
- Kiểm tra xem trường dữ liệu đã được thiết lập Collation là
utf8mb4_unicode_ci
chưa trong phpmyadmin, nếu chưa cần đổi lại như ảnh
- Sau khi thiết lập Collation mà vẫn lỗi thì khả năng kết nối PDO với MySQL đang đặt là utf8. Mở config.php lên kiểm tra dòng này
$db_config['collation'] = 'utf8_unicode_ci';
$db_config['charset'] = 'utf8';
Đổi thành
$db_config['collation'] = 'utf8mb4_unicode_ci';
$db_config['charset'] = 'utf8mb4';
- Việc đổi như thế có thể ảnh hưởng đến việc thao tác đến CSDL hiện tại. Nếu bạn lo lắng ảnh hưởng có thể thêm đoạn code sau trước khi insert, update CSDL
$sql_array = [
"SET character_set_client='utf8mb4'",
"SET character_set_results='utf8mb4'",
"SET character_set_connection='utf8mb4'"
];
foreach ($sql_array as $sql) {
$db->query($sql);
}
- Nếu thử tất cả các hướng trên vẫn không được cần kiểm tra lại dữ liệu đầu vào của bạn có hợp lệ không.
- Cuối cùng vẫn không được bạn có thể thảo luận bên dưới