R dbplyr WHERE子句cp1250 charset

时间:2018-05-05 10:09:14

标签: mysql r character-encoding dplyr dbplyr

所以我的R使用cp1250 charset,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'

虽然交易&#39;编码是cp1250,它使用的是UTF-8,但不适用于cp1250。

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

SELECT *
FROM transpl

关于什么可能出错的任何想法?

1 个答案:

答案 0 :(得分:0)

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

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

但是你要存储的列的charset怎么样? SHOW CREATE TABLE找出答案。

执行SELECT col, HEX(col) ...时,您会获得F9C3B9吗?

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