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

CentOS8 Yum安装MySQL

CentOS8 安装部署Apache+Php+MariaDB(pdo扩展)

centos 安装和配置mariadb详细教程

centos 安装和配置mariadb详细教程

MySQL数据库基础-4