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, ''),和它的工作!
小智 7
将列转换为utf8mb4字符集。utf8字符集仅限于字符
http://dev.mysql.com/doc/refman/5.6/en/charset-unicode-utf8mb4.html
我知道这并不完全是您正在寻找的答案,但许多人实际上有兴趣以正确的方式修复它,所以:
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)
或者查看您的数据库框架文档,了解如何以更简单的方式完成此操作。
例如 TypeOrm 有charset连接属性:
ALTER TABLE <table-name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11314 次 |
| 最近记录: |