Mac系统下Mysql存储数据报错 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value
2019-04-18 21:17 龙恩0707 阅读(3257) 评论(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 后可以看到,我们也能插入中文汉字了,也能查询出来哦,如下图所示: