Я создаю инфраструктуру DevOps для приложения PHP CodeIgniter. Я использую Kubernetes для настройки PHP-FPM, NGINX и MariaDB (MySQL), и все, кажется, работает отлично, за исключением того, что каждый раз, когда кто-то пытается сохранить текстовое поле, которое содержит символы с акцентом, текст сохраняется вместо NULL
и без ошибок отображаются.
Например: *. * 1004
- Имя пользователя
Testing
.
- Измените имя на
Another Testing
. (Идет хорошо)
- Изменить имя на
Helló Wôrld
. (Или что-нибудь акцентированное)
- Имя сохраняется как
""
. (Пустая строка)
Я знаю, что это не связано с приложением CodeIgniter, потому что я знаю, что оно работает без этой проблемы в другой инфраструктуре (к которой у меня нет доступа) с той же кодовой базой. Так что проблема должна быть с моей инфраструктурой.
Дамп базы данных, который я использовал для создания своей копии базы данных, был экспортирован непосредственно из рабочей инфраструктуры, в результате чего была собрана коллекция UTF8
.
Чтобы исправить это, я настроил свою конфигурацию MySQL следующим образом:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
wait_timeout = 6000
max_allowed_packet = 64M
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
И мой database.php
Файл конфигурации CodeIgniter как:
$db['default'] = array(
'dsn' => '',
'hostname' => $_SERVER["MYSQL_HOST"],
'username' => $_SERVER["MYSQL_USER"],
'password' => $_SERVER["MYSQL_PASSWORD"],
'database' => $_SERVER["MYSQL_DB"],
'dbdriver' => 'mysqli',
'dbprefix' => '',
'pconnect' => FALSE,
'db_debug' => TRUE,
'cache_on' => FALSE,
'cachedir' => '',
'char_set' => 'utf8mb4',
'dbcollat' => 'utf8mb4_unicode_ci',
'swap_pre' => '',
'encrypt' => FALSE,
'compress' => FALSE,
'stricton' => FALSE,
'failover' => array(),
'save_queries' => TRUE
);
Поэтому я существенно изменил его с utf8_general_ci
на utf8mb4_unicode_ci
.
Но это не исправлено, проблема продолжает происходить.
Я также проверил метатег HTML для набора символов и тоже для UTF-8
.
Также, вероятно, это не связано, но вот мой nginx.conf
файл:
user htdocs;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
access_log /var/log/nginx/access.log;
keepalive_timeout 3000;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
server {
listen 4080;
server_name localhost;
root /htdocs;
autoindex on;
client_max_body_size 512m;
index index.php;
location / {
try_files $uri $uri/ /index.php;
location = /index.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
location = /instashow/api/index.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
location ~ \.php$ {
return 444;
}
}
}
Есть подсказка?
EDIT:
Забыл упомянуть, что я также попытался установить для всех таблиц, столбцов и полей значение utf8mb4_unicode_ci
, а затем также "восстановить и оптимизировать" базу данных.
РЕДАКТИРОВАТЬ 2:
Я также видел этот вопрос перед тем, как опубликовать мой:
UTF-8 вплоть до
И поэтому я все равно решил опубликовать это. Я испробовал все решения и рекомендации, и я все еще на том же месте. У меня есть обратный прокси-сервер (другой NGINX), это может быть как-то связано?
РЕДАКТИРОВАТЬ 3:
Я могу вставлять акцентированные символы в базу данных вручную через PhpMyAdmin, они хранятся просто отлично. Также приложение CodeIgniter может читать и отображать их без проблем. Проблема в том, что когда дело доходит до записи в базу данных через приложение.
Это должно быть что-то не связанное с базой данных, я думаю, это может быть что-то с моей настройкой PHP, я не знаю. Влияет ли PHP-FPM на это? Я знаю, что конфигурация "кодировки по умолчанию" для PHP также установлена в UTF-8.
РЕДАКТИРОВАТЬ 4:
Имя сохраняется как ""
. (Пустая строка)
Это неправильно. Сохраняется как NULL.