欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL Server數(shù)據(jù)遷移至PostgreSQL出錯(cuò)的解釋以及解決方案

 更新時(shí)間:2014年09月22日 10:04:07   投稿:hebedich  
最近對(duì)SQL Server到PostgreSQL的數(shù)據(jù)遷移時(shí)出現(xiàn)了問(wèn)題,返回的錯(cuò)誤為:invalid byte sequence for encoding "UTF8": 0x00。經(jīng)查證pg源代碼,該問(wèn)題引起的原因是sql server的字符類型字段中含有空字符\0,該字符在pg中不支持。

問(wèn)題重現(xiàn):

1、PG客戶端:

postgres=# create table text_test (id int,info text);
CREATE TABLE
postgres=# insert into text_test values (1,E'\0x00');
ERROR: invalid byte sequence for encoding "UTF8": 0x00

2、SQL Server產(chǎn)生數(shù)據(jù)

create table test_varchar(id int,name varchar(20));
insert into test_varchar values (1, 'name' + char(0));
insert into test_varchar values (1, 'name' + '');

然后通過(guò)java程序進(jìn)行獲取數(shù)據(jù)并插入到PG,同樣會(huì)得到錯(cuò)誤信息:

invalid byte sequence for encoding "UTF8": 0x00

首先我們認(rèn)為此為gb2312轉(zhuǎn)化到UTF8時(shí),發(fā)生了無(wú)法轉(zhuǎn)化的錯(cuò)誤。經(jīng)查UTF8是變長(zhǎng)的, 1-6個(gè)字節(jié)。他的編碼規(guī)則如下:

Bits Last code point Byte 1 Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
7 U+007F 0xxxxxxx




11 U+07FF
110xxxxx 10xxxxxx



16 U+FFFF
1110xxxx 10xxxxxx
10xxxxxx



21 U+1FFFFF
11110xxx 10xxxxxx
10xxxxxx
10xxxxxx


26 U+3FFFFFF
111110xx 10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx

31 U+7FFFFFFF
1111110x 10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx
10xxxxxx

而0x00是符合UTF8規(guī)則的。這就使我們非常詫異。然后我們發(fā)現(xiàn)有兩點(diǎn)繼而確認(rèn)了問(wèn)題:
1、

PostgreSQL doesn't support storing NULL (\0x00) characters in text fields (this is obviously different from the database NULL value, which is fully supported).

If you need to store the NULL character, you must use a bytea field - which should store anything you want, but won't support text operations on it.

Given that PostgreSQL doesn't support it in text values, there's no good way to get it to remove it. You could import your data into bytea and later convert it to text using a special function (in perl or something, maybe?), but it's likely going to be easier to do that in preprocessing before you load it.

Source:http://stackoverflow.com/questions/1347646/postgres-error-on-insert-error-invalid-byte-sequence-for-encoding-utf8-0x0

2、

Terminating character

Indicated by

Tab

\t

This is the default field terminator.

Newline character

\n

This is the default row terminator.

Carriage return/line feed

\r

Backslash1

\\

Null terminator (nonvisible terminator)2

\0

Any printable character (control characters are not printable, except null, tab, newline, and carriage return)

(*, A, t, l, and so on)

String of up to 10 printable characters, including some or all of the terminators listed earlier

(**\t**, end, !!!!!!!!!!, \t—\n, and so on)

Source:http://msdn.microsoft.com/en-us/library/ms191485.aspx

由此我們確定,是pg對(duì)null的處理和SQL Server處理是不相同的,所以在這里出現(xiàn)了錯(cuò)誤。

而導(dǎo)致這一問(wèn)題的PG具體代碼如下(src/backend/utils/mb/wchar.c的pg_verify_mbstr_len):

if (!IS_HIGHBIT_SET(*mbstr))
    {
      if (*mbstr != '\0')
      {
        mb_len++;
        mbstr++;
        len--;
        continue;
      }
      if (noError)
        return -1;
      report_invalid_encoding(encoding, mbstr, len);
    }

#define IS_HIGHBIT_SET(ch)   ((unsigned char)(ch) & HIGHBIT)
#define HIGHBIT         (0x80)

report_invalid_encoding函數(shù)是將錯(cuò)誤信息返回,也就是

invalid byte sequence for encoding "UTF8": 0x00
而真正導(dǎo)致這一問(wèn)題的就是:
!IS_HIGHBIT_SET(*mbstr)當(dāng)*mbstr為0x00時(shí)進(jìn)入判斷,然后進(jìn)而判斷*mbstr是否為\0,當(dāng)為\0時(shí),直接進(jìn)入函數(shù)report_invalid_encoding報(bào)錯(cuò)。

所以出現(xiàn)此問(wèn)題的原因是PG和SQL Server對(duì)null的處理是不相同的。

處理方案 :

1、將SQL Server源數(shù)據(jù)進(jìn)行修改方法,

UPDATE: This seems to work:
 
Select * from TABLE
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0
So:
 
Update TABLE
SET naughtyField = SUBSTRING(naughtyField, 1, LEN(naughtyField) - 1)
where UNICODE(SUBSTRING(naughtyField, LEN(naughtyField), 1)) = 0
Source:http://stackoverflow.com/questions/3533320/sql-server-remove-end-string-character-0-from-data

2、對(duì)應(yīng)用進(jìn)行修改,獲取到SQL Server數(shù)據(jù)時(shí),將數(shù)據(jù)進(jìn)行轉(zhuǎn)化,和第一種方法異曲同工。

相關(guān)文章

  • SpringBoot3集成PostgreSQL的詳細(xì)過(guò)程

    SpringBoot3集成PostgreSQL的詳細(xì)過(guò)程

    PostgreSQL是一個(gè)功能強(qiáng)大的開源數(shù)據(jù)庫(kù)系統(tǒng),具有可靠性、穩(wěn)定性、數(shù)據(jù)一致性等特點(diǎn),且可以運(yùn)行在所有主流操作系統(tǒng)上,包括Linux、Unix、Windows等,這篇文章主要介紹了SpringBoot3集成PostgreSQL,需要的朋友可以參考下
    2024-03-03
  • PostgreSQL數(shù)據(jù)庫(kù)備份還原全攻略

    PostgreSQL數(shù)據(jù)庫(kù)備份還原全攻略

    本文主要介紹邏輯備份和連續(xù)歸檔方式的備份及還原,文件系統(tǒng)級(jí)備份由于比較簡(jiǎn)單,這里不在贅述,以下操作使用的數(shù)據(jù)庫(kù)版本為PostgreSQL 12.5,不同的數(shù)據(jù)庫(kù)版本在進(jìn)行連續(xù)歸檔操作時(shí)會(huì)有細(xì)微差異,需要的朋友可以參考下
    2024-04-04
  • PostgreSQL與MySQL優(yōu)劣勢(shì)比較淺談

    PostgreSQL與MySQL優(yōu)劣勢(shì)比較淺談

    這篇文章主要詳細(xì)介紹了PostgreSQL與MySQL有哪些優(yōu)劣勢(shì),文中介紹的非常詳細(xì),對(duì)于學(xué)習(xí)有一定的幫助,感興趣的小伙伴可以參考一下
    2023-04-04
  • 解決postgreSql遠(yuǎn)程連接數(shù)據(jù)庫(kù)超時(shí)的問(wèn)題

    解決postgreSql遠(yuǎn)程連接數(shù)據(jù)庫(kù)超時(shí)的問(wèn)題

    這篇文章主要介紹了解決postgreSql遠(yuǎn)程連接數(shù)據(jù)庫(kù)超時(shí)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • PostgreSQL教程(十二):角色和權(quán)限管理介紹

    PostgreSQL教程(十二):角色和權(quán)限管理介紹

    這篇文章主要介紹了PostgreSQL教程(十二):角色和權(quán)限管理介紹,本文講解了數(shù)據(jù)庫(kù)角色、角色屬性、權(quán)限、角色成員,需要的朋友可以參考下
    2015-05-05
  • 一文詳解PostgreSQL復(fù)制參數(shù)

    一文詳解PostgreSQL復(fù)制參數(shù)

    PostgreSQL 作為一款功能強(qiáng)大的開源關(guān)系型數(shù)據(jù)庫(kù),其復(fù)制功能對(duì)于構(gòu)建高可用性系統(tǒng)至關(guān)重要,本文給大家詳細(xì)介紹了PostgreSQL的復(fù)制參數(shù),需要的朋友可以參考下
    2025-05-05
  • PostgreSQL數(shù)據(jù)類型格式化函數(shù)操作

    PostgreSQL數(shù)據(jù)類型格式化函數(shù)操作

    這篇文章主要介紹了PostgreSQL數(shù)據(jù)類型格式化函數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • PostgreSQL用戶、數(shù)據(jù)庫(kù)及表的管理、操作與授權(quán)方式

    PostgreSQL用戶、數(shù)據(jù)庫(kù)及表的管理、操作與授權(quán)方式

    這篇文章主要介紹了PostgreSQL用戶、數(shù)據(jù)庫(kù)及表的管理、操作與授權(quán)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • PostgreSQL配置遠(yuǎn)程連接簡(jiǎn)單圖文教程

    PostgreSQL配置遠(yuǎn)程連接簡(jiǎn)單圖文教程

    這篇文章主要給大家介紹了關(guān)于PostgreSQL配置遠(yuǎn)程連接的相關(guān)資料,PostgreSQL是一個(gè)功能非常強(qiáng)大的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • postgresql數(shù)據(jù)合并,多條數(shù)據(jù)合并成1條的操作

    postgresql數(shù)據(jù)合并,多條數(shù)據(jù)合并成1條的操作

    這篇文章主要介紹了postgresql數(shù)據(jù)合并,多條數(shù)據(jù)合并成1條的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02

最新評(píng)論