วิธีแก้ไขข้อผิดพลาด“ ค่าสตริงไม่ถูกต้อง”?


162

หลังจากสังเกตเห็นแอปพลิเคชันมีแนวโน้มที่จะทิ้งอีเมลแบบสุ่มเนื่องจากข้อผิดพลาดของค่าสตริงที่ไม่ถูกต้องฉันไปแล้วและเปลี่ยนคอลัมน์ข้อความจำนวนมากเพื่อใช้utf8ชุดอักขระคอลัมน์และคอลัมน์เริ่มต้นเรียง ( utf8_general_ci) เพื่อที่จะยอมรับพวกเขา นี่เป็นการแก้ไขข้อผิดพลาดส่วนใหญ่และทำให้แอปพลิเคชันหยุดรับข้อผิดพลาดของ sql เมื่อมีการส่งอีเมลที่ไม่ใช่ภาษาละติน

อย่างไรก็ตามอีเมลบางส่วนยังคงทำให้โปรแกรมตีค่าสตริงที่ไม่ถูกต้อง: (Incorrect string value: '\xE4\xC5\xCC\xC9\xD3\xD8...' for column 'contents' at row 1)

คอลัมน์เนื้อหาคือMEDIUMTEXTdatatybe ซึ่งใช้utf8ชุดอักขระคอลัมน์และutf8_general_ciเรียงคอลัมน์ ไม่มีแฟล็กที่ฉันสามารถสลับในคอลัมน์นี้

โปรดทราบว่าฉันไม่ต้องการสัมผัสหรือดูรหัสต้นฉบับแอปพลิเคชันเว้นแต่จำเป็นจริงๆ:

  • อะไรเป็นสาเหตุของข้อผิดพลาดนั้น? (ใช่ฉันรู้ว่าอีเมลเต็มไปด้วยขยะแบบสุ่ม แต่ฉันคิดว่า utf8 น่าจะได้รับอนุญาตสวย)
  • ฉันจะแก้ไขได้อย่างไร
  • ผลกระทบที่เป็นไปได้ของการแก้ไขดังกล่าวมีอะไรบ้าง

สิ่งหนึ่งที่ฉันคิดคือเปลี่ยนเป็น utf8 varchar ([จำนวนมาก]) โดยเปิดใช้งานแฟล็กไบนารี แต่ฉันไม่ค่อยคุ้นเคยกับ MySQL และไม่รู้ว่าจะแก้ไขได้ไหม


3
โพสต์ชันสูตร: วิธีการแก้ปัญหาของ RichieHindleแก้ไขปัญหาและไม่ได้แนะนำปัญหาเพิ่มเติมใด ๆ ในเวลาที่มันกำลังทำงานอยู่ มันอาจจะเป็นการแฮ็คเล็กน้อย แต่ก็ใช้ได้และอนุญาตให้ฉันหลีกเลี่ยงการทำให้มือสกปรกด้วยซอฟต์แวร์ของ บริษัท อื่นที่ฉันไม่เข้าใจ ณ จุดนี้เราได้อัปเดตซอฟต์แวร์ / สคีมารุ่นใหม่ซึ่งจัดการปัญหาการเข้ารหัสทั้งหมดอย่างถูกต้อง (และใหม่พอที่รองรับจริง) ทำให้การแฮ็กโดยไม่จำเป็น
Brian

คำตอบ:


43

"\xE4\xC5\xCC\xC9\xD3\xD8"ไม่ถูกต้อง UTF-8 ทดสอบโดยใช้ Python:

>>> "\xE4\xC5\xCC\xC9\xD3\xD8".decode("utf-8")
...
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

หากคุณกำลังมองหาวิธีหลีกเลี่ยงข้อผิดพลาดในการถอดรหัสในฐานข้อมูลการเข้ารหัส cp1252 (aka "Windows-1252" หรือที่รู้จัก "Windows Western European") เป็นการเข้ารหัสที่ได้รับอนุญาตมากที่สุด - ค่าทุกไบต์เป็นจุดรหัสที่ถูกต้อง

แน่นอนว่ามันจะไม่เข้าใจ UTF-8 ของแท้อีกต่อไปหรือการเข้ารหัสที่ไม่ใช่ cp1252 อื่น ๆ แต่ดูเหมือนว่าคุณจะไม่กังวลเกี่ยวกับเรื่องนี้ใช่ไหม


4
คุณหมายความว่าอย่างไร "แน่นอนว่าจะไม่เข้าใจ UTF-8 ของแท้อีกต่อไป"
Brian

5
@ Brian: ถ้าคุณบอกว่าคุณกำลังให้มัน cp1252 และคุณจริงให้เป็น UTF-8 สำหรับการพูดก็จะตีความผิดว่าcafé caféมันจะไม่ผิดพลาด แต่มันจะเข้าใจผิดตัวอักษรสูง
RichieHindle

3
@ ริชชี่: ฐานข้อมูลสามารถโทรข้อมูลอย่างมีความสุขได้ทุกเมื่อที่ต้องการ แต่ถ้าโค้ด php ที่คว้ามันยัดเข้าไปในสตริงมันจะไม่สร้างความแตกต่างมากนัก ... ฉันไม่เห็นว่าการขาดความเข้าใจของ UTF-8 นั้นมีผลกระทบอะไร
Brian

7
@Brian: ไม่คุณพูดถูก เวลาที่มันสร้างความแตกต่างจะอยู่ในฐานข้อมูลตัวอย่างเช่นถ้าคุณใช้ส่วนคำสั่ง ORDER BY ใน SQL ของคุณการเรียงลำดับนั้นจะไม่มีประสิทธิภาพหากคุณมีอักขระที่ไม่ใช่ ASCII
RichieHindle

11
โปรดยกเลิกการทำเครื่องหมายคำตอบนี้เป็นวิธีแก้ปัญหาการซ่อนข้อผิดพลาดไม่ใช่วิธีการแก้ปัญหาใด ๆ ถอดหลอดความร้อนสูงเกินไปออกจากรถของคุณแล้วคุณจะเห็น
David Vartanian

133

ฉันจะไม่แนะนำคำตอบ Richies เพราะคุณกำลังพลาดข้อมูลในฐานข้อมูล คุณจะไม่แก้ไขปัญหาของคุณ แต่พยายาม "ซ่อน" มันและไม่สามารถดำเนินการฐานข้อมูลที่จำเป็นด้วยข้อมูล crapped

หากคุณพบข้อผิดพลาดนี้ข้อมูลที่คุณกำลังส่งไม่ได้เข้ารหัส UTF-8 หรือการเชื่อมต่อของคุณไม่ใช่ UTF-8 ก่อนอื่นให้ตรวจสอบว่าแหล่งข้อมูล (ไฟล์, ... ) จริงๆคือ UTF-8

จากนั้นตรวจสอบการเชื่อมต่อฐานข้อมูลของคุณคุณควรทำสิ่งนี้หลังจากเชื่อมต่อ:

SET NAMES 'utf8';
SET CHARACTER SET utf8;

ถัดไปตรวจสอบว่าตารางที่จัดเก็บข้อมูลมีชุดอักขระ utf8:

SELECT
  `tables`.`TABLE_NAME`,
  `collations`.`character_set_name`
FROM
  `information_schema`.`TABLES` AS `tables`,
  `information_schema`.`COLLATION_CHARACTER_SET_APPLICABILITY` AS `collations`
WHERE
  `tables`.`table_schema` = DATABASE()
  AND `collations`.`collation_name` = `tables`.`table_collation`
;

ขั้นสุดท้ายตรวจสอบการตั้งค่าฐานข้อมูลของคุณ:

mysql> show variables like '%colla%';
mysql> show variables like '%charac%';

หากแหล่งที่มาการขนส่งและปลายทางเป็น UTF-8 ปัญหาของคุณจะหายไป;)


1
@Kariem: นี่แปลกเพราะการตั้งค่านี้ครอบคลุมโดยคำสั่ง SET NAMES ซึ่งเทียบเท่ากับการเรียก SET character_set_client, SET character_set_results, SET character_set_connection dev.mysql.com/doc/refman/5.1/th/charset-connection.html
nico gawenda

2
คำสั่งที่สองควรเป็นSET CHARACTER SET utf8(ไม่ใช่ CHARACTER_SET)
Coder

6
แม้ว่าคำตอบนี้จะช่วยในการตรวจสอบปัญหา แต่ก็ไม่ตอบว่าจะแก้ไขอย่างไร ฉันเห็น "latin1" แทนที่จะเป็น "utf-8"
Vanuan

2
คำตอบนี้ดีมากในการอธิบายปัญหา แต่ยากจนมากในรายละเอียดการแก้ปัญหา (ซึ่งเป็นสิ่งที่ OP ขอ) @nicogawenda: ทุกคำสั่ง SQL ที่จะเรียกใช้เพื่อแก้ไขปัญหาได้อย่างสมบูรณ์คืออะไร? จะแก้ไขข้อมูลที่มีอยู่ทั้งหมดได้อย่างไร?
Clint Eastwood

1
"ถ้าแหล่งที่มาการขนส่งและปลายทางคือ UTF-8 ปัญหาของคุณหายไปแล้ว)" นั่นเป็นกลอุบายของฉัน
suarsenegger

80

ประเภท utf-8 ของ MySQL นั้นไม่ถูกต้อง utf-8 - มันใช้สูงถึงสามไบต์ต่อตัวอักษรและรองรับเฉพาะ Basic Multilingual Plane (เช่นไม่มี Emoji, ไม่มีระนาบคล้ายดาว ฯลฯ )

หากคุณจำเป็นต้องเก็บค่าจากที่สูงขึ้นเครื่องบิน Unicode คุณจำเป็นต้องมีการเข้ารหัส utf8mb4


9
ฉันคิดว่านี่น่าจะเป็นการแก้ไขที่ดีที่สุด อัพเกรดเป็น 5.5 และแทนที่ utf8 ด้วย utf8mb4 ในคำตอบข้างต้น ฉันกำลังแทรกข้อมูล utf8 จาก Twitter ที่มีอิโมจิหรือตัวอักษรอื่น ๆ ที่ต้องการ 4 ไบต์
rmarscher

สมมติว่าเราจะไม่อัปเกรดเป็น 5.5 เราจะระงับข้อผิดพลาดได้อย่างไร
ผู้ใช้

ฉันเลื่อนไปไกลเกินไปสำหรับคำตอบที่มีประโยชน์มากที่สุดนี้
Handheldblender

1
10 ปีตั้งแต่คำถามเดิม ปล่อยให้มันรู้ว่าการเข้ารหัส utf8 ของ MySQL นั้นไม่เหมาะสม utf8 ใช้ utf8mb4! กันไปสำหรับ MariaDB มิฉะนั้นคุณจะไม่มีน้ำตาแห่งความปิติยินดี😂
เลียม

51

ตารางและเขตข้อมูลมีการเข้ารหัสผิด อย่างไรก็ตามคุณสามารถแปลงเป็น UTF-8

ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;

1
ฉันคิดว่าอันนี้เป็นคำตอบที่ถูกต้องของทั้งหมด ฉันมีสองตารางมีรูปแบบ utchar 8 แต่ละรูปแบบ หนึ่งในนั้นได้รับข้อผิดพลาดอีกอันหนึ่งใช้ได้ แม้ว่าฉันจะเลือก 'อัปเดต' ผู้ใช้ให้ทำสำเนาจากคอลัมน์ 'ดี' utf8 ไปยังตารางอื่นข้อผิดพลาดเดียวกันเกิดขึ้น เป็นเพราะตารางทั้งสองนั้นถูกสร้างขึ้นใน MySQL รุ่นต่าง ๆ
AiShiguang

ใช่ มันเป็นการกำหนดค่าผิดพลาดจากตารางฐานข้อมูลของฉันด้วย ฉันคิดว่าคำตอบนี้ควรเป็นคำตอบที่ถูกต้อง ปัญหาของฉันคือการเปรียบเทียบที่เลือกคือ utf8_unicode_ci แทนที่จะเป็น utf8_general_ci ขอบคุณ :)
jprivillaso

2
คำตอบนี้มีการทำอะไรที่นี่ควรจะอยู่ด้านบน
Sagun Shrestha

1
อันนี้ช่วยได้มันจะบอกคุณว่าควรลองทำอะไรแทนที่จะผิดพลาด
Victor Di

ขอบคุณ! มันช่วยฉันได้มากฉันได้เปลี่ยน ant collation table ที่ฉันคิดว่าควรเป็นอย่างนั้น แต่ฟิลด์นั้นยังคงเป็น ascii collation ...
Radu

25

ฉันแก้ไขปัญหานี้วันนี้ด้วยการเปลี่ยนคอลัมน์เป็นประเภท 'LONGBLOB' ซึ่งเก็บไบต์ดิบแทนตัวอักษร UTF-8

ข้อเสียเพียงอย่างเดียวของการทำเช่นนี้คือคุณต้องดูแลการเข้ารหัสด้วยตัวเอง หากไคลเอนต์ของแอปพลิเคชันของคุณใช้การเข้ารหัส UTF-8 และอีกอันใช้ CP1252 คุณอาจส่งอีเมลของคุณด้วยอักขระที่ไม่ถูกต้อง เพื่อหลีกเลี่ยงนี้มักจะใช้การเข้ารหัสเดียวกัน (เช่น UTF-8) ในการใช้งานของคุณทั้งหมด

อ้างถึงหน้านี้http://dev.mysql.com/doc/refman/5.0/en/blob.htmlสำหรับรายละเอียดเพิ่มเติมเกี่ยวกับความแตกต่างระหว่าง TEXT / LONGTEXT และ BLOB / LONGBLOB นอกจากนี้ยังมีข้อโต้แย้งอื่น ๆ อีกมากมายบนเว็บที่พูดถึงสองสิ่งนี้


1
วิธีนี้ดูเหมือนจะเป็นวิธีที่ง่ายที่สุด ฉันลองการเข้ารหัสอื่น ๆ ไม่กี่ครั้งโดยไม่ประสบความสำเร็จ
Simeon Abolarinwa

10

ก่อนอื่นให้ตรวจสอบว่า default_character_set_name ของคุณคือ utf8

SELECT default_character_set_name FROM information_schema.SCHEMATA S WHERE schema_name = "DBNAME";

หากผลลัพธ์ไม่ใช่ utf8 คุณต้องแปลงฐานข้อมูลของคุณ ตอนแรกคุณต้องบันทึกดัมพ์

หากต้องการเปลี่ยนชุดอักขระที่เข้ารหัสเป็น UTF-8 สำหรับตารางทั้งหมดในฐานข้อมูลที่ระบุให้พิมพ์คำสั่งต่อไปนี้ที่บรรทัดคำสั่ง แทนที่ DBNAME ด้วยชื่อฐานข้อมูล:

mysql --database=DBNAME -B -N -e "SHOW TABLES" | awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' | mysql --database=DBNAME

ในการเปลี่ยนชุดอักขระที่เข้ารหัสเป็น UTF-8 สำหรับฐานข้อมูลเองให้พิมพ์คำสั่งต่อไปนี้ที่พร้อมท์mysql > แทนที่ DBNAME ด้วยชื่อฐานข้อมูล:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

ตอนนี้คุณสามารถลองอีกครั้งเพื่อเขียนอักขระ utf8 ลงในฐานข้อมูลของคุณ โซลูชันนี้ช่วยฉันเมื่อฉันพยายามอัปโหลดไฟล์ csv จำนวน 200,000 แถวไปยังฐานข้อมูลของฉัน


8

โดยทั่วไปสิ่งนี้จะเกิดขึ้นเมื่อคุณแทรกสตริงลงในคอลัมน์ที่มีการเข้ารหัส / การจัดเรียงที่เข้ากันไม่ได้

ฉันได้รับข้อผิดพลาดนี้เมื่อฉันมี TRIGGERs ซึ่งสืบทอดการจัดเรียงของเซิร์ฟเวอร์ด้วยเหตุผลบางประการ และค่าเริ่มต้นของ mysql คือ (อย่างน้อยบน Ubuntu) latin-1 พร้อมการจัดเรียงแบบสวีเดน แม้ว่าฉันจะมีฐานข้อมูลและตั้งค่าตารางทั้งหมดเป็น UTF-8 แต่ฉันก็ยังไม่ได้ตั้งค่าmy.cnf :

/etc/mysql/my.cnf:

[mysqld]
character-set-server=utf8
default-character-set=utf8

และสิ่งนี้จะต้องแสดงรายการทริกเกอร์ทั้งหมดด้วย utf8- *:

select TRIGGER_SCHEMA, TRIGGER_NAME, CHARACTER_SET_CLIENT, COLLATION_CONNECTION, DATABASE_COLLATION from information_schema.TRIGGERS

และตัวแปรบางตัวที่อยู่ในรายการนี้ควรมี utf-8- * (ไม่มีการเข้ารหัส latin-1 หรือการเข้ารหัสอื่น ๆ ):

show variables like 'char%';

6

แม้ว่าการเปรียบเทียบของคุณจะถูกตั้งค่าเป็น utf8_general_ci แต่ฉันสงสัยว่าการเข้ารหัสอักขระของฐานข้อมูลตารางหรือคอลัมน์อาจแตกต่างกัน

ALTER TABLE tabale_name MODIFY COLUMN column_name VARCHAR(255)  
CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;

5

ฉันได้รับข้อผิดพลาดที่คล้ายกัน ( Incorrect string value: '\xD0\xBE\xDO\xB2. ...' for 'content' at row 1) ฉันได้ลองกับตัวละครเปลี่ยนชุดของคอลัมน์และหลังจากนั้นข้อผิดพลาดที่มีการเปลี่ยนแปลงไปutf8mb4 ปรากฎว่า mysql แสดงให้ฉันเห็นข้อผิดพลาดผิด ผมหันชุดอักขระด้านหลังของคอลัมน์และเปลี่ยนชนิดของคอลัมน์เพื่อ หลังจากนั้นข้อผิดพลาดก็หายไป ฉันหวังว่ามันจะช่วยให้ใครบางคน โดยวิธี MariaDB ในกรณีเดียวกัน (ฉันได้ทดสอบ INSERT เดียวกันที่นั่น) เพียงแค่ตัดข้อความโดยไม่มีข้อผิดพลาด'Data too long for column 'content' at row 1'
utf8MEDIUMTEXT


MySQL เช่นกันฉันก็เบื่อหลายสิ่งหลายอย่างรู้ตัวว่า mysql ไม่รองรับการถอดรหัสแบบ 4 ไบต์ utf-8 ที่รุ่นนี้และกำลังพยายามที่จะเข้าใจว่าอะไรเป็นสาเหตุของปัญหานี้ เห็นได้ชัดว่าการเปลี่ยนประเภทคือคำตอบซึ่งเป็นทางออกทันที
Liza

4

ข้อผิดพลาดนั้นหมายความว่าคุณมีสตริงที่มีการเข้ารหัสที่ไม่ถูกต้อง (เช่นคุณกำลังพยายามป้อนสตริงที่เข้ารหัส ISO-8859-1 ในคอลัมน์ที่เข้ารหัส UTF-8) หรือคอลัมน์ไม่รองรับข้อมูลที่คุณพยายามป้อน

ในทางปฏิบัติปัญหาหลังเกิดจากการใช้งาน MySQL UTF-8 ที่รองรับอักขระ UNICODE ที่ต้องการ 1-3 ไบต์เท่านั้นเมื่อแสดงใน UTF-8 ดูที่"ค่าสตริงไม่ถูกต้อง" เมื่อพยายามแทรก UTF-8 ลงใน MySQL ผ่าน JDBC? สำหรับรายละเอียด


2

วิธีแก้ปัญหาสำหรับฉันเมื่อพบกับค่าสตริงที่ไม่ถูกต้อง: '\ xF8' สำหรับข้อผิดพลาดของคอลัมน์โดยใช้ scriptcase คือการตรวจสอบให้แน่ใจว่าฐานข้อมูลของฉันตั้งค่าสำหรับ utf8 ทั่วไป ci และดังนั้นการเปรียบเทียบฟิลด์ของฉัน จากนั้นเมื่อฉันนำเข้าข้อมูลไฟล์ csv ของฉันฉันโหลด csv ลงใน UE Studio จากนั้นบันทึกในรูปแบบ utf8 และ Voila! มันใช้งานได้อย่างมีเสน่ห์มี 29,000 รายการที่ไม่มีข้อผิดพลาด ก่อนหน้านี้ฉันพยายามอิมพอร์ต excel ที่สร้างขึ้น csv


2

ฉันได้ลองวิธีแก้ปัญหาทั้งหมดข้างต้นแล้ว (ซึ่งทั้งหมดนี้นำมาซึ่งคะแนนที่ถูกต้อง) แต่ไม่มีอะไรที่ทำงานให้ฉัน

จนกว่าฉันจะพบว่า MySQL แมปเขตข้อมูลตารางของฉันใน C # ใช้ถูกประเภท: MySqlDbType.Blob ฉันเปลี่ยนเป็นMySqlDbType.Textและตอนนี้ฉันสามารถเขียนสัญลักษณ์ UTF8 ทั้งหมดที่ฉันต้องการได้!

ps เขตข้อมูลตาราง MySQL ของฉันเป็นประเภท "LongText" อย่างไรก็ตามเมื่อฉันสร้างการแมปฟิลด์โดยอัตโนมัติโดยใช้ซอฟต์แวร์ MyGeneration มันจะตั้งประเภทฟิลด์เป็น MySqlDbType.Blob ใน C # โดยอัตโนมัติ

น่าสนใจฉันใช้ MySqlDbType.Blob กับ UTF8 เป็นเวลาหลายเดือนโดยไม่มีปัญหาจนกระทั่งวันหนึ่งฉันได้ลองเขียนสตริงที่มีอักขระบางตัวในนั้น

หวังว่าสิ่งนี้จะช่วยให้คนที่กำลังดิ้นรนเพื่อหาเหตุผลสำหรับข้อผิดพลาด


1

ฉันเพิ่มไบนารีก่อนชื่อคอลัมน์และแก้ไขข้อผิดพลาด charset

แทรกลงในค่า tableA (binary stringcolname1);


1

สวัสดีฉันยังได้รับข้อผิดพลาดนี้เมื่อฉันใช้ฐานข้อมูลออนไลน์ของฉันจากเซิร์ฟเวอร์ godaddy ฉันคิดว่ามันมีรุ่น mysql 5.1 ขึ้นไป แต่เมื่อฉันทำจากเซิร์ฟเวอร์ localhost ของฉัน (รุ่น 5.7) มันก็ดีหลังจากนั้นฉันสร้างตารางจากเซิร์ฟเวอร์ภายในและคัดลอกไปยังเซิร์ฟเวอร์ออนไลน์โดยใช้ mysql yog ฉันคิดว่าปัญหาอยู่กับชุดตัวอักษร

ภาพหน้าจอที่นี่


1

เพื่อแก้ไขข้อผิดพลาดนี้ผมอัพเกรดฐานข้อมูล MySQL ของฉันไป utf8mb4 ที่สนับสนุนเต็มชุดอักขระ Unicode โดยทำตามนี้กวดวิชารายละเอียด ฉันขอแนะนำให้ทำอย่างระมัดระวังเพราะมี gotchas ค่อนข้างน้อย (เช่นคีย์ดัชนีอาจใหญ่เกินไปเนื่องจากการเข้ารหัสใหม่หลังจากที่คุณต้องแก้ไขประเภทฟิลด์)


1

มีคำตอบที่ดีในที่นี่ ฉันเพิ่งเพิ่มของฉันเนื่องจากฉันพบข้อผิดพลาดเดียวกัน แต่กลายเป็นปัญหาที่แตกต่างอย่างสิ้นเชิง (อาจจะเหมือนกันบนพื้นผิว แต่สาเหตุที่แตกต่างกัน)

สำหรับฉันข้อผิดพลาดเกิดขึ้นสำหรับฟิลด์ต่อไปนี้:

@Column(nullable = false, columnDefinition = "VARCHAR(255)")
private URI consulUri;

เรื่องนี้จบลงด้วยการถูกเก็บไว้ในฐานข้อมูลเป็นเลขฐานสองของURIชั้น สิ่งนี้ไม่ได้เพิ่มการตั้งค่าสถานะใด ๆ ด้วยการทดสอบหน่วย (โดยใช้ H2) หรือการทดสอบ CI / การรวม (โดยใช้MariaDB4j ) แต่มันจะระเบิดขึ้นในการตั้งค่าแบบใช้งานจริงของเรา (แม้ว่าเมื่อเข้าใจปัญหาแล้วมันก็ง่ายพอที่จะเห็นค่าที่ผิดในอินสแตนซ์ของ MariaDB4j แต่มันก็ไม่ได้ทำให้เกิดการทดสอบ) วิธีแก้ปัญหาคือการสร้าง mapper ประเภทที่กำหนดเอง:

package redacted;

import javax.persistence.AttributeConverter;
import java.net.URI;
import java.net.URISyntaxException;

import static java.lang.String.format;

public class UriConverter implements AttributeConverter<URI, String> {
    @Override
    public String convertToDatabaseColumn(URI attribute) {
        return attribute.toString();
    }

    @Override
    public URI convertToEntityAttribute(String field) {
        try {
            return new URI(field);
        }
        catch (URISyntaxException e) {
            throw new RuntimeException(format("could not convert database field to URI: %s", field));
        }
    }
}

ใช้ดังนี้:

@Column(nullable = false, columnDefinition = "VARCHAR(255)")
@Convert(converter = UriConverter.class)
private URI consulUri;

เท่าที่มีการเกี่ยวข้องกับไฮเบอร์เนตดูเหมือนว่าจะมีโปรแกรมแมปประเภทที่มีให้รวมถึงjava.net.URLแต่ไม่ใช่สำหรับjava.net.URI(ซึ่งเป็นสิ่งที่เราต้องการที่นี่)


1

ในกรณีของฉันปัญหาได้รับการแก้ไขโดยเปลี่ยนการเข้ารหัสคอลัมน์ Mysql เป็น 'ไบนารี' (ชนิดข้อมูลจะถูกเปลี่ยนเป็น VARBINARY โดยอัตโนมัติ) อาจเป็นไปได้ว่าฉันจะไม่สามารถกรองหรือค้นหาด้วยคอลัมน์นั้น แต่ฉันไม่ต้องการสิ่งนั้น


1

หากคุณเกิดขึ้นกับการประมวลผลค่ากับฟังก์ชั่นสตริงบางอย่างก่อนที่จะบันทึกตรวจสอบให้แน่ใจว่าฟังก์ชั่นสามารถจัดการอักขระหลายไบต์อย่างถูกต้อง ฟังก์ชั่นสตริงที่ไม่สามารถทำเช่นนั้นและพูดความพยายามที่จะตัดทอนอาจแยกหนึ่งตัวอักษรหลายไบต์เดียวที่อยู่ตรงกลางและที่อาจทำให้เกิดสถานการณ์ข้อผิดพลาดสตริง

ใน PHP ตัวอย่างเช่นคุณจะต้องเปลี่ยนจากการsubstrmb_substr


0

ในกรณีของฉันก่อนอื่นฉันจะได้พบกับ '???' ในเว็บไซต์ของฉันจากนั้นฉันตรวจสอบชุดอักขระของ Mysql ซึ่งเป็นละตินตอนนี้ดังนั้นฉันเปลี่ยนเป็น utf-8 จากนั้นฉันเริ่มโครงการของฉันใหม่จากนั้นฉันได้รับข้อผิดพลาดเดียวกันกับคุณแล้วฉันพบว่าฉันลืมเปลี่ยนชุดอักขระของฐานข้อมูล และเปลี่ยนเป็น utf-8 บูมมันใช้งานได้


0

ฉันลองเกือบทุกขั้นตอนที่กล่าวถึงที่นี่ ไม่มีใครทำงาน ดาวน์โหลด mariadb มันได้ผล ฉันรู้ว่านี่ไม่ใช่วิธีแก้ปัญหา แต่สิ่งนี้อาจช่วยให้ใครบางคนสามารถระบุปัญหาได้อย่างรวดเร็วหรือให้วิธีแก้ปัญหาชั่วคราว

Server version: 10.2.10-MariaDB - MariaDB Server
Protocol version: 10
Server charset: UTF-8 Unicode (utf8)

0

ในกรณีของฉันIncorrect string value: '\xCC\x88'...ปัญหาคือว่า o-umlaut อยู่ในสถานะสลายตัว คำถามและคำตอบนี้ช่วยให้ฉันเข้าใจความแตกต่างระหว่างและ öใน PHP การแก้ไขสำหรับฉันคือการใช้ห้องสมุด Normalizer ของ PHP เช่นNormalizer::normalize('o¨', Normalizer::FORM_C).


-2

1 - คุณต้องประกาศว่าการเชื่อมต่อของคุณเหมาะสมในการเข้ารหัส UTF8 http://php.net/manual/en/mysqli.set-charset.php

2 - หากคุณใช้บรรทัดคำสั่ง mysql เพื่อรันสคริปต์คุณต้องใช้แฟล็กเช่น: Cmd: C:\wamp64\bin\mysql\mysql5.7.14\bin\mysql.exe -h localhost -u root -P 3306 --default-character-set=utf8 omega_empresa_parametros_336 < C:\wamp64\www\PontoEletronico\PE10002Corporacao\BancoDeDadosModelo\omega_empresa_parametros.sql

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.