gpt4 book ai didi

java - 使用带有 REPLACE 选项的 LOAD DATA INFILE 时跳过包含非 BMP 字符(表情符号)的行?

转载 作者:行者123 更新时间:2023-11-29 20:03:34 24 4
gpt4 key购买 nike

表情符号字符弄乱了我们构建的加载系统,我正在寻找一个简单的短期解决方案。

它是一个Java加载程序,使用JDBC执行MySQL命令,结构如下:

LOAD DATA
LOCAL INFILE `filepath`
REPLACE INTO TABLE `SOME_TABLE`
CHARACTER SET utf8
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\'' ESCAPED BY ''
LINES TERMINATED BY '\n'
(`col1`,...,`coln`)

SOME_TABLE 具有 ENGINE=InnoDB DEFAULT CHARSET=utf8

我们正在运行 MySQL 5.6.22。

它多年来一直工作良好,但最近我们加载的文件开始偶尔出现非 BMP 字符(恰好是表情符号),并且 LOAD DATA LOCAL INFILE ... 命令会抛出异常,例如:

java.sql.SQLException: Incorrect string value: '\xF0\x9D\x93\x9C' for column 'fieldm' at row 3004

据我了解,长期解决方案是我们需要将表移至 CHARSET=utf8mb4。然而,此时的表很大,转换并不容易。还有 VARCHAR(255) 索引字段,这些需要转换为 VARCHAR(191) [以适应最大 key 长度 767],否则我们需要为 DYNAMIC 行格式并设置 innodb_large_prefix=true

我们正在寻找短期解决方案,直到我们有时间和资源迁移到 utfmb4。

从短期来看,只需丢弃包含非 BMP(表情符号)字符的行就可以了。但是,LOAD DATA LOCAL INFILE filepath REPLACE ... 不会跳过坏行,它会使整个文件失败。

此时,看起来我们需要在调用LOAD DATA LOCAL INFILE filepath REPLACE ...之前用Java编写一些过滤来删除非BMP(表情符号)行。但是,我认为在 MySQL 中一定有某种方法可以做到这一点,而不必引入那种预过滤器。

有人有什么想法可以让 MySQL 简单地跳过包含非 BMP(表情符号)数据的行吗?

***** 更新 *****看起来使用 CONVERT 可能是短期的解决方案。这样做会将表情符号替换为“???”在第4 栏。

LOAD DATA
LOCAL INFILE `filepath`
REPLACE INTO TABLE `SOME_TABLE`
CHARACTER SET utf8
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\'' ESCAPED BY ''
LINES TERMINATED BY '\n'
(`col1`,`col2`,`col3`,@q, ..., `coln`)
SET `col4` = CONVERT(CONVERT(@q USING utf8mb4) USING utf8);

有人发现这有问题吗?

最佳答案

为了存储表情符号,您必须始终使用 utf8mb4,而不是 utf8。

解决 191 索引问题的捷径(也许)是升级到 5.7。在那里,您可以保留 255 并且有索引。

只有某些列会包含表情符号,对吗?仅转换那些列。 (同一个表中的不同列可以具有不同的字符集和/或排序规则。)

关于java - 使用带有 REPLACE 选项的 LOAD DATA INFILE 时跳过包含非 BMP 字符(表情符号)的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40433141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com