2017-06-15 21 views
0

我使用R和DBI查詢PosgreSQL中的數據,但得到了帶有怪異字符的損壞結果。我檢查了服務器編碼和客戶端編碼,它們都是UTF-8。這就是我所做的使用RPosgreSQL從PosgreSQL數據庫查詢時返回錯誤的文本編碼

  1. 連接到數據庫

    庫(DBI)

    康恩< - 數據庫連接( DRV = RPostgreSQL :: PostgreSQL的(), 主機= *, DBNAME = , user = , password = *

  2. 獲取結果

    result_df < - dbGetQuery( 康涅狄格州, 「從some_table 選擇描述 其中USER_ID = 1234」 )

  3. 結果 我得到了什麼是ã¯ã˜ã‚ã¾ã—ã¦1008(ã¨ãƒ¼ã‚„orã¨ã…ーや)ã¨ã„ã„ã¾ã™ã€‚ 表ç¾ã™ã‚‹ã®ãŒå¤§å¥½ããªå­ã§ã™!! 感性ãŒäººã¨ã‚ºãƒ¬ã¦ã¾ã™(笑) ãŠæ­Œã‚’ã‚‚ã£ã¨ã†ã¾ããªã‚ŠãŸã„ã§ã™ã€‚ 而實際文字是はじめまして1008(とーやorとぅーや)といいます。 表現するのが大好きな子です!! 感性が人とズレてます(笑) お歌をもっとうまくなりたいです。

我通過閱讀文本再次測試,然後打印回

x <- 'はじめまして1008(とーやorとぅーや)といいます。 表現するのが大好きな子です!! 感性が人とズレてます(笑) お歌をもっとうまくなりたいです。' 
print(x) 
>> はじめまして1008(とーやorとぅーや)といいます。 表現するのが大好きな子です!! 感性が人とズレてます(笑) お歌をもっとうまくなりたいです。 

沒有什麼錯,在這種情況下,編碼的,所以我覺得當數據從數據庫分爲R返回發生的問題,但我不知道如何解決它。

+0

當你使用R主機上的psql查詢時,它看起來如何? –

+0

它看起來像是這樣的'ããããã¾¾-ã|1008(ー¼「或」ーã「,」ã「」ãããã™ã€¨¨ç¾ã™ã, ã®ãŒå¤§å¥½ããªåã§ã™! æ「Ÿæ€§ãººã¨ã,ºãƒãã|ã¾ã™(ç¬')ãã,ã,'ã,ããããããããã™ãããŠããã™ã§ã™' –

+0

所以它似乎有與R.無關。psql -l show和show client_encoding ;.你有沒有在pg_conversion中進行任何轉換? –

回答

0


RPostgreSQL不設置字符串編碼正確,請參閱本issue

所以在此期間你必須自己聲明編碼。隨着 dplyr,你可以做這樣的:

suppressPackageStartupMessages({ 
    library(dplyr) 
    library(RPostgreSQL) 
}) 

my_con <- 
    dbConnect(
    PostgreSQL(), 
    user = my_username, 
    password = my_password, 
    host = my_host, 
    dbname = my_dbname 
) 

my_table <- tribble(
    ~user_id, ~description, 
    "1234",  "はじめまして1008(とーやorとぅーや)といいます。 表現するのが大好きな子です!! 感性が人とズレてます(笑) お歌をもっとうまくなりたいです。" 
) 

copy_to(my_con, my_table) 

result_df <- dbGetQuery(my_con, "SELECT description FROM my_table WHERE user_id = '1234'") 

declare_utf8 <- function(x) { 
    Encoding(x) <- "UTF-8" 
    x 
} 

result_df %>% mutate_if(is.character, declare_utf8) %>% pull() 
#> [1] "はじめまして1008(とーやorとぅーや)といいます。 表現するのが大好きな子です!! 感性が人とズレてます(笑) お歌をもっとうまくなりたいです。" 

dbDisconnect(my_con) 
#> [1] TRUE 

pull()是沒有必要在這裏。我只是用它,因爲你的description 不會在我的機器上打印爲data.frame(),因爲我的機器上有 另一個character encoding bug, 因此我將它作爲矢量輸出。