ติดต่อลงโฆษณา [email protected]

ผู้เขียน หัวข้อ: ภาษาไทย กับ Data Type แบบ VARCHAR()  (อ่าน 4389 ครั้ง)

0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้

ออฟไลน์ specht

  • New Member
  • *
  • กระทู้: 2
    • ดูรายละเอียด
ภาษาไทย กับ Data Type แบบ VARCHAR()
« เมื่อ: 16/02/07, 05:37:07 »
ปัญหาคือ ใช้ฟอรั่มของ SMF 1.1.1 แล้วมีปัญหาการตั้งชื่อกระทู้ภาษาไทย เท่าที่ลองตรวจสอบตาม error มันไปจบลง MySQL ตารางที่เก็บชื่อกระทู้ไว้สำหรับการค้นหา ซึ่ง Data Type ของ Field นี้ตั้งไว้เป็น VARCHAR(20) จะแก้ปัญหาอย่างไรดี?


รายละเอียดเบื้องต้นที่เกี่ยวข้อง
Forum : SMF 1.1.1
MySQL : 5.0.27 (Strict Mode)
Encoding : utf8_unicode_ci ทั้งตัวภาษาและการเรียงลำดับ
ตารางใน MySQL ของ SMF ที่มีปัญหา : smf_log_search_subjects
Field ที่มีปัญหา : word (ไว้สำหรับตัดคำจากชื่อกระทู้และใช้เพื่อการค้นหา)
Data Type : VARCHAR(20)
ความรู้ด้าน php และ mysql : ไม่มี ปกติเคยลง CMS และ Forum ปรับแต่งทั่วไป ไม่เคยแก้ php หรือ mysql เลย จึงมาขอความช่วยเหลือเพราะต้อง set เจ้า SMF ให้ได้


เท่าที่ผมลองไปอ่านจากเว็บของ mysql อธิบายเรื่อง Data Type แบบ CHAR() และ VARCHAR() คือเป็นเรื่องของการนับตัววรรค ดังนั้นผมเลยคิดว่าพอมันมาเจอภาษาไทยเลยมีปัญหากับการวรรคคำ และด้วยค่าที่มันกำหนดไว้เป็น (20) ทำให้อักขระสูงสุดที่จะตัดเข้าเก็บจะมีเพียง 20 ตัว เมื่อเงื่อนไขบางอย่างไม่ตรงตามนี้มันเลยเกิด error ขึ้น โดย error ที่ฟ้องจากตัวของ SMF แจ้งมาว่า

โค้ด: [เลือก]
Database Error
Data too long for column 'word' at row 1
File: D:\xxxx\xxxx\httpdocs\forums\Sources\Subs.php
Line: 457

เมื่อตามไปดูบรรทัดนั้น (คัดมาให้ตั้งแต่บรรทัดที่ 442 - 459 โดยบรรทัดตาม error เป็นบรรทัดที่ 457 คือ VALUES (" . implode('), )

โค้ด: [เลือก]
// Insert the new subject.
if ($parameter2 !== null)
{
$parameter1 = (int) $parameter1;
$parameter2 = text2words($parameter2);

$inserts = array();
foreach ($parameter2 as $word)
$inserts[] = "'$word', $parameter1";

if (!empty($inserts))
db_query("
INSERT INTO {$db_prefix}log_search_subjects
(word, ID_TOPIC)
VALUES (" . implode('),
(', array_unique($inserts)) . ")", __FILE__, __LINE__);
}
break;

มันก็คือตาราง smf_log_search_subjects ใน Field ของ word

ทั้งหมดนี้ผมสมมติฐานเอาตามความรู้ที่แทบจะไม่มีเลยในการแก้ปัญหาของ DB error หากว่ามีวิธีแก้ แหล่งข้อมูล คำแนะนำหรือที่นำมาลงทั้งหมดนี้ผิดประเด็นก็ขอคำชี้แนะด้วยครับ

ขอขอบคุณล่วงหน้า