Thursday, August 13, 2009

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Thai_CI_AS"


Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS"
and "Thai_CI_AS" in the equal to operation.
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK
TRANSACTION statement is missing. Previous count = 0, current count = 1.
  • ด้านล่างนี้คือ execute store procedure โดยตรง
(1 row(s) affected)

Msg 468, Level 16, State 9, Procedure M_SEARCH, Line 116

Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "Thai_CI_AS" in the equal to operation.


Msg 266, Level 16, State 2, Procedure M_SEARCH, Line 116

Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
  • คือ ใน store procedure ในเงื่อนไข where พยายามเปรียบเทียบ ข้อมูลกับ subquery ของ
  • temp table ซึ่งเราไม่ได้กำหนด collation อ่ะนะ
  • แต่ทำไมก่อนหน้านี่ไม่เห็นเป็นไรเลยหว่า เราต้อง restore ข้อมูล
  • หรือ จะเกี่ยวกับที่เราทดสอบ replication เป็น publication หว่า
  • select ... from table where ... = (select ... from #temptable where ...)

สาเหตุที่สรุปได้น่าจะเป็น
  • ประมาณเปรียบเทียบข้อมูล charset คนละแบบเช่น ในกรณีนี้ table จริงจะเป็น Thai_CI_AS
  • แต่ temp table เป็นไรไม่รู้ ใช้ที่อื่นไม่มีปัญหานะ
  • แต่วันนี้ปัญหาเกิดจากอาไรไม่รุ้จริง
  • ลองแก้โดยคำสั่งสร้าง create #table ใส่ collate Thai_CI_AS ให PK ของ table

CREATE TABLE [dbo].[#temp_table](
[member_code] [varchar](50) COLLATE Thai_CI_AS NOT NULL PRIMARY KEY
)
  • ปรากฏว่าโปรแกรม ไม่แสดง exception นี้อ่ะ
  • งง อย่างแรง

อื่นๆ
  • เคยย้ายข้อมูลจาก MySQL ไป SQLServer
  • มีปัญหาตอนจะ join เอาข้อมูลใน MySQL ซึ่ง 2 table มี อันหนึ่งใช้ tis-620 อีกอันใช้ latin
  • ทำให้ select คำสั่งที่มี join ไม่ได้เลย
  • เท่าที่จำได้คิดว่า MySQL จะแยก charset ของ table กับ column แต่ละอันเลยนะ
  • ไม่แน่ใจว่า SQLServer จะกำหนดได้เฉพาะ table อย่างเดียวป่าว ซึ่ง column ทุกตัวต้องมีคุณสมบัติ charset เหมือน table นั้นๆ

สรุปสุดท้าย
  • การกระทำระหว่าง สองค่าซึ่งมี charset ต่างกัน น่าจะใช่ปัญหานี่แหละ
  • ซึ่งระบบจริง ไม่เห็นจะมีปัญหาเรื่อง collate ของ temp table เลยอ่ะ
  • แล้วทำไมมีปัญหา เมื่อเราเอา มา restore ทดสอบบน VM หว่า
  • หรือว่า sqlserver config จะมีปัญหาหว่า งง อีกรอบ อย่างแรง



No comments:

Post a Comment

Popular Posts