ER_TRUNCATED_WRONG_VALUE_FOR_FIELD将一些字符串保存到mysql

Flu*_*ffy 1 regex mysql utf-8 node.js

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

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

我想这是因为有些人物在外面utf8.我知道可以utf8mb在mysql中使用charset,但在这种情况下我不关心这些字符,只想从字符串中删除它们而不是更改mysql配置.

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

Flu*_*ffy 14

这里的RFC包含一个unicode char代码列表以及它们采用的字符数:

   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
Run Code Online (Sandbox Code Playgroud)

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

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

这个页面显示所有这些字符是2分字节的,我还是试图消除宽(3个或多个字节)从我的字符串,字符.replace(/[\u0800-\uFFFF]/g, ''),和它的工作!

  • 谢谢你的回答.替换非常方便! (2认同)
  • .replace(/ [\ u0800- \ uFFFF] / g,'')-太棒了!! 解决了我所有存储在LONGTEXT列中的JSON问题,非常感谢!!! (2认同)

小智 7

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

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

  • 嗯,我仍然收到表上的“ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci”错误。 (4认同)

Pav*_*vel 7

我知道这并不完全是您正在寻找的答案,但许多人实际上有兴趣以正确的方式修复它,所以:

1. 备份数据库:

mysqldump -h HOSTNAME -u USERNAME -p DATABASE_NAME > PATH_TO_FILE
Run Code Online (Sandbox Code Playgroud)

例子:

mysqldump -h 127.0.0.1 -u root -p music > ~/music-db-backup.sql
Run Code Online (Sandbox Code Playgroud)

这将询问您的数据库密码。如果您想在命令中包含密码 - 将其添加到后面,-p中间不留空格,例如-pJazzMusic

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

更新数据库:

ALTER DATABASE <database-name>
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci
Run Code Online (Sandbox Code Playgroud)

更新表:

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

mysqldump -h HOSTNAME -u USERNAME -p DATABASE_NAME > PATH_TO_FILE
Run Code Online (Sandbox Code Playgroud)

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

mysqldump -h 127.0.0.1 -u root -p music > ~/music-db-backup.sql
Run Code Online (Sandbox Code Playgroud)

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

转换单个字段:

ALTER DATABASE <database-name>
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci
Run Code Online (Sandbox Code Playgroud)

3. 建立连接以供使用utf8mb4

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

SET NAMES "utf8mb4"
Run Code Online (Sandbox Code Playgroud)

MySQL 文档 - 设置名称

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

ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
Run Code Online (Sandbox Code Playgroud)