代码改变世界

Mac系统下Mysql存储数据报错 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value

2019-04-18 21:17  龙恩0707  阅读(3206)  评论(0编辑  收藏  举报

比如如下mysql操作插入数据:

const mysql = require('mysql');
/*
 createConnection方法创建一个表示与Mysql数据库服务器之间连接的 Connection对象
*/
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  database: 'my_db',
  user: 'root',
  password: '123456'
});

/*
 connection 对象被创建之后,可以使用该对象的 connect方法建立mysql数据库服务器之间的连接
*/
connection.connect((err) => {
  if (err) {
    console.log('数据库连接失败');
  } else {
    console.log('数据库连接成功');
    // 执行sql新增数据操作
    connection.query('INSERT INTO User SET ?', {
      UserName: '空智2',
      Password: '123456789'
    }, (err, res) => {
      if (err) {
        console.log(err);
        console.log('插入数据失败');
      } else {
        console.log('插入数据成功,我接着再查询一遍');
        connection.query('SELECT * FROM ??', ['User'], (err, res) => {
          if (err) {
            console.log('查询数据失败');
          } else {
            console.log(res);
          }
        })
      }
    })
    /*
     在不需要使用该数据库的时候,可以使用 Connection对象的end方法或destory方法关闭数据库之间的连接
    */
    connection.end((err1) => {
      if (err1) {
        console.log('关闭数据库操作失败');
      } else {
        console.log('关闭数据库操作成功');
      }
    })
  }
});

然后在命令行中执行 node app.js 后报错如下信息:

经过百度搜索,这个原因是MySql编码的问题。UTF-8编码有可能是两个、三个、四个字节。而Mysql的utf8编码最多3个字节,所以数据插不进去。

解决方法:

1. 找到 my.cnf, 执行命令如下:

sudo find / -name my.cnf

如下所示:

2. 修改编码方式; 把下面配置放到my.cnf中

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_bin  #utf8mb4_unicode_ci 会导致部分字符查询出错

如下图所示:

3. 保存,重启Mysql服务

启动MySQL服务
sudo /usr/local/mysql/support-files/mysql.server start

停止MySQL服务
sudo /usr/local/mysql/support-files/mysql.server stop

重启MySQL服务
sudo /usr/local/mysql/support-files/mysql.server restart

mysql 重启完成后,登录mysql,查看配置是否生效了,如下所示:

如上执行命令:SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

可以看到生效了,

4. 重新创建数据库。

create database 我的数据库名称;

如下图所示:

查看所有的数据库,如下图所示

5. 创建表。命令如下:

CREATE TABLE User
(
ID int NOT NULL AUTO_INCREMENT,
UserName varchar(255) NOT NULL,
Password varchar(255) NOT NULL,
PRIMARY KEY (ID)
);

如下所示

6. 查看表的编码,如下命令:show create table user;

如下所示:

7, 我们再执行下代码如下(在命令行中执行 node app.js):

const mysql = require('mysql');
/*
 createConnection方法创建一个表示与Mysql数据库服务器之间连接的 Connection对象
*/
const connection = mysql.createConnection({
  host: 'localhost',
  port: 3306,
  database: 'new_my_db',
  user: 'root',
  password: '123456'
});

/*
 connection 对象被创建之后,可以使用该对象的 connect方法建立mysql数据库服务器之间的连接
*/
connection.connect((err) => {
  if (err) {
    console.log('数据库连接失败');
  } else {
    console.log('数据库连接成功');
    // 执行sql新增数据操作
    connection.query('INSERT INTO User SET ?', {
      UserName: '我是空智',
      Password: '123456789'
    }, (err, res) => {
      if (err) {
        console.log(err);
        console.log('插入数据失败');
      } else {
        console.log('插入数据成功,我接着再查询一遍');
        connection.query('SELECT * FROM ??', ['User'], (err1, res) => {
          console.log(err1)
          if (err1) {
            console.log('查询数据失败');
          } else {
            console.log(res);
          }
        })
      }
    })
  }
});

报错的信息  如下图所示:

报错的信息提示:Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xE6\x88\x91\xE6\x98\xAF...' for column 'UserName' at row 1

上述的问题还是因为编码的问题产生的,因为我们使用了已经创建好的数据库和表,但是编码并没有改成 utf-8;

通过以下命令查看表的编码:

show create table (数据库名.表名);

如下图所示:

修改方法如下:

ALTER TABLE new_my_db.user CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

如下图所示:

我们再来查看下user表的列字段的编码如下:(使用命令:show FULL COLUMNS FROM new_my_db.user;)

改完以后,我们再来执行 我们的上面的代码,在命令行中执行 node app.js 后可以看到,我们也能插入中文汉字了,也能查询出来哦,如下图所示: