我使用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删除此类字符?
答案 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'
// ...
});