source

오류 1366: 마리아에 문자열을 삽입할 때 잘못된 문자열 값DB

lovecheck 2023. 6. 6. 08:27
반응형

오류 1366: 마리아에 문자열을 삽입할 때 잘못된 문자열 값DB

색인이 있는 MariaDB 테이블이 있습니다.VARCHAR(10) NOT NULL COLLATE 'utf8mb3_general_ci'type. Go에 10자로 자른 문자열이 있습니다. 더 길면 이 테이블에 삽입/업데이트할 수 있습니다.다음과 같이 문자열을 자릅니다.

if len(value) > 10 {
  value = value[:10]
}

현재 다음으로 끝나는 문자열에 문제가 발생했습니다.š성격.MariaDB에서 오류 발생:Error 1366: Incorrect string value: '\\xC5'유니코드 테이블을 검색하는 중, 이 문자는 다음과 같이 표시됩니다.\xc5\xa1끈을 자르는 것이 데이터베이스에서 끈을 소화할 수 없게 만든다고 믿게 만드는군요?

모든 데이터베이스 방법을 검토하고 모든 문자열을 마사지해야 하기 때문에 코드에서 utf8/unicode를 처리하는 것을 피하고 싶습니다.그리고 저는 이것이 필요하다고 생각하지 않습니다. 왜냐하면 저는 전에 그것이 필요했던 적이 없었기 때문입니다.그래서 저는 문제가 다른 곳에 있다고 생각하지만 어디에 있는지는 잘 모르겠습니다.

데이터 정렬을 다음으로 전환하려고 했습니다.utf8mb4_general_ci하지만 그것도 도움이 되지 않았습니다.

흥미롭게도 HeidiSQL로 직접 열을 편집하면 문자열이 잘 저장됩니다.그래서 이게 운전자의 문제일 수도 있다고 생각합니다.사용 중입니다.github.com/go-sql-driver/mysql여느 때와 같이그러니 문제가 생길 것 같지는 않지만, 누가 알겠어요...

끈을 자르는 것이 데이터베이스에서 끈을 소화할 수 없게 만든다고 믿게 만드는군요?

다음과 같이 하위 분할하여 문자열 절단value[:10](및 길이 측정)len프로그램이 멀티바이트 문자를 처리할 가능성이 있는 경우)는 항상 실수입니다.이는 문자열 인덱싱이 해당 바이트에서 작동하기 때문이며, 이는 멀티바이트 인코딩의 일부일 수도 있고 아닐 수도 있습니다.

당신이 알아낸 것처럼, 그 캐릭터는 UTF-8로 암호화되어 있습니다.\xc5\xa1이 두 바이트가 사용자에게 표시되는 경우value인덱스에서 바로 문자열9그리고.10당신의 색인식[:10]데이터가 손상됩니다.

문자 집합utf8mb3그리고.utf8mb4승인된 UTF-8의 범위를 각각 3바이트와 4바이트 문자로 제한하지만,\xc5UTF-8은 처음부터 유효하지 않으므로 어느 쪽이든 거부됩니다.

MariaDB에서 데이터 유형이 있는 열VARCHAR(N)문자 를 계산합니다(정렬로 지정됨).당신은 당신의 것을 자르고 싶습니다.value문자열을 10바이트가 아닌 10번째 문자로 입력합니다.

내 코드에서 utf8/unicode를 처리하는 것을 피하고 싶습니다.

을 ""DB"로 을 인정하고 .utf8mb3코드의 입력 데이터를 UTF-8로 적절하게 처리하는 것이 논리적일 뿐입니다. n번째 문자(으)로 runeGo에서 유니코드 코드 포인트를 나타냄)는 다음과 같은 것을 사용할 수 있습니다.

// count the runes
if utf8.RuneCountInString(value) > 10 {
  // convert string to rune slice
  chars := []rune(value)
  // index the rune slice and convert back to string
  value = string(chars[:10])
}

이것은 UTF-8 인코딩을 손상시키지는 않겠지만, 예를 들어 조인자가 작성된 문자를 더 많이 할당하고 고려하지 않는다는 것을 명심하십시오.200D관련되어 있습니다.

언급URL : https://stackoverflow.com/questions/70789977/error-1366-incorrect-string-value-when-inserting-strings-into-mariadb

반응형