ER_TRUNCATED_WRONG_VALUE_FOR_FIELD将一些字符串保存到mysql

时间:2015-07-29 11:14:19

标签: mysql regex node.js utf-8

我使用node.js,node-mysql npm模块,在mysql(sql_mode=STRICT_ALL_TABLES)中有一个utf8列,并且可以存储"常规" utf8通常是chars,但是对于某些输入它会抛出这个:

AssertionError: Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD: Incorrect string value: '\xF3\xA5\xB5\xA5\xEF\xBF...'

我想这是因为某些角色在utf8之外。我知道可以在mysql中使用utf8mb charset,但是在这种情况下我并不关心这些字符,只想从字符串中删除它们而不是更改mysql配置。

是否可以使用node.js删除此类字符?

3 个答案:

答案 0 :(得分:13)

RFC here提供了一个unicode字符代码列表以及它们所占用的字符数:

   Char. number range  |        UTF-8 octet sequence
      (hexadecimal)    |              (binary)
   --------------------+---------------------------------------------
   0000 0000-0000 007F | 0xxxxxxx
   0000 0080-0000 07FF | 110xxxxx 10xxxxxx
   0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
   0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

虽然我提供的错误消息未显示任何宽字符:

node -e 'console.log("\xF3\xA5\xB5\xA5\xEF\xBF")'
ó¥µ¥ï¿

并且this页面显示所有这些字符都是2字节字符,我仍然尝试使用.replace(/[\u0800-\uFFFF]/g, '')从字符串中删除宽(3个或更多个八位字节)字符,并且它有效!

答案 1 :(得分:7)

将列转换为 utf8mb4 字符集。 utf8 字符集仅限于字符

http://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html

答案 2 :(得分:2)

我知道这不完全是您要寻找的答案,但实际上很多人会对以正确的方式修复它感兴趣,因此:

1.备份您的数据库:

mysqldump -h HOSTNAME -u USERNAME -p DATABASE_NAME > PATH_TO_FILE

示例:

mysqldump -h 127.0.0.1 -u root -p music > ~/music-db-backup.sql

这会询问您的数据库密码。如果您想在命令中包含密码 - 在 -p 之后添加它,中间没有空格,例如-pJazzMusic

2.将您的字段字符集 utf8mb4 和排序规则更改为 utf8mb4_0900_ai_ci(与 Unicode v9 兼容)。此外,更新表和数据库本身也是一个好主意。

更新数据库:

ALTER DATABASE <database-name>
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci

更新表:

一次性更新表格及其字段:
(请记住,在较大的表上可能需要大量时间并产生显着的 IO 峰值)

ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

或者,根据具体情况更新表格和字段:

ALTER TABLE <table-name>
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci

这样,预先存在的字段将保持其旧的字符集/排序规则。

转换单个字段:

ALTER TABLE <table-name>
MODIFY COLUMN <column-name> varchar(64)
CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci
NOT NULL;

3.建立连接以使用 utf8mb4

您可以在连接后立即将此查询发送到您的数据库:

SET NAMES "utf8mb4"

MySQL Documentation - Set Names

或者查看您的数据库框架文档,了解如何以更简单的方式进行操作。
例如 TypeOrm 具有 charset 连接属性:

import { createConnection } from 'typeorm';

const connection = await createConnection({
    type: 'mysql',
    host: '127.0.0.1',
    port: 3306,
    charset: 'utf8mb4'
    // ...
});