MariaDB10在CentOS8和Ubuntu18.04下不同
Posted sjg20010414
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MariaDB10在CentOS8和Ubuntu18.04下不同相关的知识,希望对你有一定的参考价值。
一个功能在本地Ubuntu18.04开发机器上可以正常插入记录(yii2),代码传到服务器(从Windows 2008迁移到CentOS8)就是不行,感觉诡异,都是mariadb数据库啊
在console中写了段测试,大致如下
$data=[
//....
];
$model = new ResetUser();
$model->load($data);
if ($model->save())
echo 'save ok'.php_EOL;
else
var_dump($model->getErrors());
结果保存失败,错误提示为:
Exception 'yii\\db\\Exception' with message 'SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\\xE5\\x90\\xB4\\xE5\\x85\\x88...' for column `gxlq_pig`.`reset_user`.`old_name` at row 1
The SQL being executed was: INSERT INTO `reset_user` (`username`, `old_name`, `new_name`, `new_password`, `note`, `request_user_id`, `request_user_name`, `created_at`, `updated_at`) VALUES ('1002', '吴先华', 'Shen', '654321', '111', 1, '系统管理员', 1630039010, 1630039010)'
in /home/sjg/www/gxlq_pig/vendor/yiisoft/yii2/db/Schema.php:678
Error Info:
Array
(
[0] => 22007
[1] => 1366
[2] => Incorrect string value: '\\xE5\\x90\\xB4\\xE5\\x85\\x88...' for column `gxlq_pig`.`reset_user`.`old_name` at row 1
)
大致搜索了一下此类问题,是编码问题。在服务器和本地都是在mariadb命令下执行:
show variables like 'character_set_%';
果然输出不一样。仔细了解CentOS8下的mariadb和ubuntu里面的mariadb的默认配置文件,发现ubuntu的更人性化一点:
ubuntu的mariadb的配置文件主要是在 /etc/mysql/mariadb.conf.d目录下一些“50-”开头的文件,很容易知道服务器配置是“50-server.cnf”,里面的设置相较CentOS下的要更多(细致)一些,最重要的“友情提示”是:
#
# * Character sets
#
# MySQL/MariaDB default is Latin1, but in Debian we rather default to the full
# utf8 4-byte character set. See also client.cnf
#
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
CentOS8的配置文件主要是在 /etc/my.cnf.d/目录下,服务器配置文件mariadb-server.cnf,我把字符集定义写入[mariadb]小节:
[mariadb]
character-set-server=utf8mb4
稳妥起见,先用 mysqldump -u$user -p$pwd $db | gzip > $filename.sql.gz 备份数据库(解压时gunzip $filename.sql.gz即可)。然而,直接 sudo systemctl restart mariadb 和数据库内drop掉数据库再create+source导入并不解决问题!!!后来,我才记起来,出问题的那个表是在转换到新的CentOS8服务器再migrate的,同时在本地和服务器上用 show create table $tablename发现果然,服务器上该表字符集为latin1(因为默认CentOS8下的mariadb是没有被修改的状态),而本地开发机器是utf8 。
问题清楚,比较好办。因为该表在服务器上一条记录都没有的(插入不了),所以,先migrate/down 1,然后再migrate/up 1,再在console下试验头部那段代码,插入就成功了(那里插入不了是因为在latin1字符集下无法插入中文)。
以上是关于MariaDB10在CentOS8和Ubuntu18.04下不同的主要内容,如果未能解决你的问题,请参考以下文章
Centos8 MariaDB10.3.28升级为MariaDB10.5.13