【问题标题】:R dbplyr WHERE clause cp1250 charsetR dbplyr WHERE 子句 cp1250 字符集
【发布时间】:2018-05-05 10:09:14
【问题描述】:

所以我的 R 使用 cp1250 字符集,sessionInfo() 输出:

R version 3.4.2 (2017-09-28)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 7 x64 (build 7601) Service Pack 1

Matrix products: default

locale:
[1] LC_COLLATE=Czech_Czech Republic.1250  LC_CTYPE=Czech_Czech Republic.1250    LC_MONETARY=Czech_Czech Republic.1250
[4] LC_NUMERIC=C                          LC_TIME=Czech_Czech Republic.1250

现在我想使用 dbplyr 包来处理 MySQL 数据库。起初,当我连接到 DB 时,我发送以下 mysql 查询:

SET NAMES 'cp1250';

然后当我像这样发送 SELECT 语句时:

SELECT dg_group
FROM transpl
WHERE `dg_group` = 'Hodgkinův lymfom'

它返回 0 行。但!当我将字符串 'Hodgkinův lymfom' 的字符编码设置为 UTF-8 时,它会返回所有相关行。我将字符编码设置为 UTF-8,如下所示:

x <- 'Hodgkinův lymfom'
Encoding(x) <- 'UTF-8'

然后,当我将变量x 放入 WHERE 子句时,SELECT 语句如下所示:

SELECT dg_group
FROM transpl
WHERE `dg_group` = 'Hodgkin<f9>v lymfom'

虽然事务的编码是 cp1250,但它适用于 UTF-8,但不适用于 cp1250。

顺便说一句,当我使用SET NAMES 'cp1250' 进行以下 SELECT 语句时,行中的返回值会正确显示:

SELECT *
FROM transpl

你知道什么是错的吗?

【问题讨论】:

    标签: mysql r character-encoding dplyr dbplyr


    【解决方案1】:

    这些字符集将十六进制 F9 视为 ů:cp1250、cp1256、dec8、latin1、latin2、latin5。对于utf8/utf8mb4,为十六进制C3B9

    SET NAMES 宣布客户端的字符集。

    但是您要存储到的列的字符集呢? SHOW CREATE TABLE了解一下。

    在执行SELECT col, HEX(col) ... 时,你会得到F9 还是C3B9

    更多讨论:Trouble with UTF-8 characters; what I see is not what I stored

    【讨论】:

    • 在我写我的问题的时候,我并没有真正理解发生了什么以及为什么会发生所描述的情况而不是“预期的”情况。那时我不再处理理解这件事了。然而,当我在这个领域经历了不同的经历时,我再次遇到了我的问题,现在我明白了发生了什么,所以我将你的答案标记为正确的答案。谢谢。
    猜你喜欢
    • 2013-08-24
    • 2016-07-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多