Mac系統下Mysql存儲數據報錯 ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value


比如如下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 后可以看到,我們也能插入中文漢字了,也能查詢出來哦,如下圖所示:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM