|
|
|
MSSQL Collation : Cyrillic_General_CI_AS Query ออกมาเป็นเครื่องหมายคำถาม |
|
|
|
|
|
|
|
ลองดูครับ
Code (PHP)
setlocale(LC_ALL, 'th_TH.utf-8');
|
|
|
|
|
Date :
2020-04-28 12:49:22 |
By :
Pong Thep |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ตอนบันทึกไฟล์ การ encoding ของมัน..ถ้าไม่ได้ใช้ collation unicode ก็ลองบันทึกเป็นอย่างอื่น เช่น tis 620.
|
|
|
|
|
Date :
2020-04-28 13:38:40 |
By :
mr.v |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เจออีกคนแล้ว รู้จักไหม code responding คุณโต้ตอบมาอย่างนี้ใครจะใช้ ค.ว.ย. (คิด วิเคราะห์ แยกแยะ) ได้ครบ
ขอโคีดการแสดงข้อมูลมาดูครับ ทั้ง php และ html ครบองค์ประกอบ เน้นนะครับ แค่ครบองค์ประกอบ ไม่ต้องทั้งหมดถ้าโค๊ดมันยาวมาก
เพื่อจะได้รู้ว่าคุณเข้าใจการเขียนจริงตามที่ข้างบนเขาบอก
ผมบอกก็เหมือนข้างบนที่เขาบอกไว้แล้ว
แต่คนทำเข้าใจอย่างไร
ปล.
iconv('CP874', 'UTF-8//IGNORE', $row['name']); เพิ่มสีแดงเข้าไปดูหน่อย
https://www.php.net/manual/en/function.iconv.php
|
ประวัติการแก้ไข 2020-04-29 06:22:10 2020-04-29 06:26:59
|
|
|
|
Date :
2020-04-29 06:19:18 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ทดสอบให้ดูหน่อยครับ
Code (PHP)
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>Page Title</title>
</head>
<body>
<?php
$conn = mssql_connect("localhost","rf","12345") or die("Error Connect to Database");
$char_query = mssql_query("SELECT top 1
CONVERT(VARBINARY(25), Name, 1) ad CName,
Name
FROM RF_WORLD.dbo.tbl_base");
//setlocale(LC_ALL, 'th_TH.utf-8');
while($row = mssql_fetch_array($char_query)){
?>
<table border="1">
<tr>
<td style="width: 180px; padding : 10px;" ><pre>
<?=json_encode($row)?>
</pre><br>
<?=Hex2Bin($row['CName']?><br>
<?=$row['Name']?><br>
</td>
</tr>
</table>
<?php }?>
</body>
</html>
ปล. ถ้ามี structure table มาดูด้วยก็ดีนะครับ
|
ประวัติการแก้ไข 2020-04-30 06:25:54 2020-04-30 06:28:21
|
|
|
|
Date :
2020-04-30 06:19:19 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ผมได้ลองโค๊ตแก้ไขบางจุดแต่ยัง error ครับ
message: Error converting data type nvarchar to varbinary. (severity 16)
Code (PHP)
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<head>
<title>Page Title</title>
</head>
<body>
<?php
$conn = mssql_connect("localhost","rf","12345") or die("Error Connect to Database");
$char_query = mssql_query("SELECT top 1
CONVERT(VARBINARY(25), Name, 1) AS CName,Name
FROM RF_WORLD.dbo.tbl_base");
//setlocale(LC_ALL, 'th_TH.utf-8');
while($row = mssql_fetch_array($char_query)){
?>
<table border="1">
<tr>
<td style="width: 180px; padding : 10px;" >
<pre>
<?=json_encode($row)?>
</pre><br>
<?=Hex2Bin($row['CName'])?><br>
<?=$row['Name']?><br>
</td>
</tr>
</table>
<br>
<?php
}
?>
</body>
</html>
การตั้งค่าใน SSMS ครับ
เกี่ยวไหมครับว่า Cyrillic_General_CI_AS แสดงภาษาไทยไม่ได้
แต่ใน SSMS แสดงได้ ก็ยัง งงๆอยู่ครับ
ข้อมูลภาษาไทยก็สามารถ where หาจาก php ได้
แต่กลับแสดงเป็น ?????
|
ประวัติการแก้ไข 2020-04-30 17:51:55
|
|
|
|
Date :
2020-04-30 17:51:09 |
By :
โปรตั้ว |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้าเป็น ตระกูล nvarchar nchar ntext ตัดเรื่อง collation ออกไปได้เลยครับ ไม่เกี่ยว
เพราะตระกูล n..... จะเป็น utf8 ไม่ใช้ collation ครับ
ไม่ต้อง ใช้ iconv echo ออกไปตรงๆ ได้เลย
แต่เดา ว่าตอน นำเข้าข้อมูล มีการแปลง เป็น win874 หรือ tis-620 มากกว่า ซึ่งผิดวิธีการนำเข้า
หรือ html doctype ตอนนำเข้าไม่ใข่ utf8 หรือเปล่า
เวลานำเข้าสำหรับ n..... ให้ใช้ set fieldname = n'ทดสอบภาษาไทย' ถีงจะแสดงผลแบบ utf8 โดยไม่ต้องแปลงอะไร
ที่นี้การแก้ปัญหาตอนนี้ ลอง
iconv( 'tis620', 'utf8//ignore', fieldname); ดูครับเนื่องจากนำเข้า เป็นภาษาไทย ไม่ใช่นำเข้าด้วยภาษารัสเซีย
แต่ไม่รับรองว่าจะได้ เพราะไม่รู้ว่าตอนนำเข้าทำแบบไหน
ปล. sql statement ไม่ต้อง convert อะไรทั้งสิ้น ใช้ php iconv พอ
|
ประวัติการแก้ไข 2020-04-30 18:15:10
|
|
|
|
Date :
2020-04-30 18:13:59 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
จากการทดลองสร้างตารางใหม่ ตั้งค่าตามฐานข้อมูลเดิม
ผมลองบันทึกแบบunicode
Insert .... N'ภาษาไทย'
โดนตั้งค่า
Name เป็น Cyrillic_General_CI_AS
Nickname เป็น Thai_CI_AS
ใส่
<meta http-equiv="Content-Type" content="text/html; charset=tis-620">
ถ้าใช้ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
ภาษาเพี้ยนหมด
|
|
|
|
|
Date :
2020-05-01 13:57:06 |
By :
โปรตั้ว |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้าใช้ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
ต้องใช้ echo iconv('tis-620', 'utf-8', $name);
ถ้าใช้ <meta http-equiv="Content-Type" content="text/html; charset=tis-620">
ต้องใช้ echo $name;
เพราะตอนนำเข้าเป็น ภาษาไทยไงครับ
ก็ไม่รู้ว่า ตอนนำเข้าๆ ยังไง ถ้าบอกวิธีนำเข้า และ table structure
คนอื่นๆก็ตอบได้กันหมดแล้วล่ะครับ กว่าจะตอบได้ ก็ต้องขอโน่นนี่นั่น ต้องลองอ้อมโลกไปอีก
ที่แรกผมเองก็นึกว่าใช้ varchar เลยให้ลอง convert เป็น hexa จะได้รู้ว่าข้อมูลถูกต้องไหม
แต่มันดันเป็น nvarchar มันเลยมีเออเร่อร์ แต่ก็ทำให้รู้ว่าเก็บแบบไหน
|
|
|
|
|
Date :
2020-05-01 14:40:36 |
By :
Chaidhanan |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SQL server เพิ่งมี UTF-8 ในเวอร์ชัน 2019
https://docs.microsoft.com/en-us/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver15
SSMS แสดงได้ถูกต้องเพราะใช้ code page จาก client OS ซึ่งเป็นภาษาไทย
การบันทึกภาษาหนึ่ง(unicode) ลงใน collation ที่เป็นอีกภาษาหนึ่ง(โดยเฉพาะกรณีของคุณเป็น UCS-2) unicode จะถูกแปลงเป็น code ตามรูปแบบของ collation ของภาษาที่กำหนด(Cyrillic) พอดึงกลับมาแสดงเราจะไม่ได้โค้ดจากต้น Unicode แต่ได้อันที่แปลงเป็นรัสเซีย รหัสอักขระภาษาที่รับกลับมาไม่ตรงกับปลายทาง(ภาษาไทย) รหัสนั้นไม่มีจึงเกิด error และแสดงเป็น ?
ในเมื่อมันยุ่งยากในการจัดการ
ในระดับฐานข้อมูล (db level) ก็ใส่ collation มันทั้งสองแบบ โดยเพิ่ม column ทำเป็นคู่กัน
ในระดับโปรแกรม (app level) ค่อยคิวรี่แยกเอา
หมายเหตุ มโนตามรูปและอิง ยังไม่ลอง
|
|
|
|
|
Date :
2020-05-02 17:52:19 |
By :
PhrayaDev |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 02
|