<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ใดๆในโลกล้วน   Postgres</title>
    <description>The latest articles on DEV Community by ใดๆในโลกล้วน   Postgres (@everthing-was-postgres).</description>
    <link>https://dev.to/everthing-was-postgres</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F8996%2Fa9d4bef4-760f-4d13-b108-f894868b3f65.png</url>
      <title>DEV Community: ใดๆในโลกล้วน   Postgres</title>
      <link>https://dev.to/everthing-was-postgres</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/everthing-was-postgres"/>
    <language>en</language>
    <item>
      <title>จัดการข้อมูล Mac Address ให้อยู่หมัดด้วย PostgreSQL</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Tue, 24 Jun 2025 18:11:48 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/cchadkaarkhmuul-mac-address-aihyuuhmaddwy-postgresql-10el</link>
      <guid>https://dev.to/everthing-was-postgres/cchadkaarkhmuul-mac-address-aihyuuhmaddwy-postgresql-10el</guid>
      <description>&lt;h2&gt;
  
  
  บทนำ
&lt;/h2&gt;

&lt;p&gt;เมื่อต้องจัดการข้อมูลที่เกี่ยวข้องกับระบบเครือข่ายใน PostgreSQL MAC Address จะมีบทบาทสำคัญในการติดตามอุปกรณ์ บันทึกกิจกรรมเครือข่าย และจัดการความปลอดภัย รู้หรือไม่ PostgreSQL มีประเภทข้อมูล macaddr ในตัวเพื่อจัดการ MAC Address อย่างมีประสิทธิภาพ&lt;br&gt;
บทความนี้เราจะอธิบายเกี่ยวกับ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mac Address คืออะไร&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.เหตุใดคุณจึงควรใช้ macaddr แทนฟิลด์ข้อความ&lt;/p&gt;

&lt;p&gt;3.วิธีจัดเก็บ ค้นหา และจัดรูปแบบที่อยู่ MAC ใน PostgreSQL&lt;/p&gt;

&lt;p&gt;4.แนวทางปฏิบัติที่ดีที่สุดสำหรับการสร้างดัชนีและเพิ่มประสิทธิภาพการค้นหา MAC Address&lt;/p&gt;
&lt;h2&gt;
  
  
  Mac Address คืออะไร
&lt;/h2&gt;

&lt;p&gt;MAC address (Media Access Control Address) คือ หมายเลขประจำเครื่องเฉพาะ ที่ใช้ระบุอุปกรณ์เครือข่าย (Network Interface) เช่น คอมพิวเตอร์, โทรศัพท์มือถือ, เราเตอร์, Wi-Fi card ฯลฯ ในระดับ Layer 2 ของ OSI Model (Data Link Layer) โดยมีรูปแบบ รหัสแบบ 16 ตัวอักษร (6 ไบต์ = 48 บิต) เขียนในรูป เลขฐาน 16 (Hexadecimal) เช่น&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;00:1A:2B:3C:4D:5E
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;โดยค่า mac address จะบ่งบอกถึง&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ส่วนของ MAC Address&lt;/th&gt;
&lt;th&gt;ขนาด&lt;/th&gt;
&lt;th&gt;ความหมาย&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OUI (Organizationally Unique Identifier)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3 ไบต์แรก&lt;/td&gt;
&lt;td&gt;ระบุผู้ผลิต (เช่น Apple, Intel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NIC Specific&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3 ไบต์หลัง&lt;/td&gt;
&lt;td&gt;รหัสเฉพาะของการ์ดอุปกรณ์นั้น&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  เหตุใดคุณจึงควรใช้ macaddr แทนฟิลด์ข้อความ
&lt;/h2&gt;

&lt;p&gt;เราก็จะเกิดคำถามว่าทำไม Postgres ต้องมีการข้อมูลประเภท macaddr สร้างในเมื่อเราสามารถใช้ข้อมูลประเภท text ได้ซึ่งประโยชน์ของข้อมูลประเภท macaddr คือ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ประสิทธิภาพการจัดเก็บ&lt;/strong&gt; ใช้เพียง 6 ไบต์แทนการแสดงข้อความที่ยาวกว่า&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;การจัดรูปแบบอัตโนมัติ&lt;/strong&gt; รับประกันรูปแบบมาตรฐาน (08:00:2b:01:02:03)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;การค้นหาที่รวดเร็วยิ่งขึ้น&lt;/strong&gt; รองรับการสร้างดัชนีที่มีประสิทธิภาพสำหรับการค้นหาอย่างรวดเร็ว&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;การรองรับการเปรียบเทียบในตัว&lt;/strong&gt; อนุญาตให้มีการเปรียบเทียบ =, &amp;lt;, &amp;gt; สำหรับการเรียงลำดับและการกรอง&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  วิธีจัดเก็บ ค้นหา และจัดรูปแบบที่อยู่ MAC ใน PostgreSQL
&lt;/h2&gt;

&lt;p&gt;1.การสรา้งตารางที่มีcolcumn ที่มีข้อมูลประเภท macaddr&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;device_name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mac_address&lt;/span&gt; &lt;span class="n"&gt;MACADDR&lt;/span&gt; &lt;span class="k"&gt;UNIQUE&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;u&gt;หมายเหตุ&lt;/u&gt;ต้องมีการกำหนดข้อจำกัด ค่า mac_address เป็น UNIQUE เพื่อป้องกันการเก็บค่า mac address ซ้ำ&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2.การเก็บข้อมูล  macaddr ดำเนินการผ่านคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mac_address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Router'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'08:00:2b:01:02:03'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;u&gt;หมายเหตุ&lt;/u&gt;ในกรณีที่เราบันทึกค่า mac address ที่ไม่มี colon(08002b010203) เมื่อบันทึกลงฐานข้อมูลจะมีการจัด format ให้ถูกต้อง&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;3.การเรียกดูข้อมูลผ่านคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;mac_address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'08:00:2b:01:02:03'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  แนวทางปฏิบัติที่ดีที่สุดสำหรับการสร้างดัชนีและเพิ่มประสิทธิภาพการค้นหา MAC Address
&lt;/h2&gt;

&lt;p&gt;เราสามารถเพิ่มประสิทธิธภาพในการเรียกดูข้อมูลประเภท  macaddr ผ่านการสรา้ง index&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;mac_index&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mac_address&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;การจัดรูปแบบ MAC Address โดยลบเฉพาะของผู้จำหน่ายของที่อยู่ MAC
การตัดทอนที่อยู่ MAC (โดยเก็บเฉพาะตัวระบุเฉพาะขององค์กรหรือ OUI):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;macaddr_trunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mac_address&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะได้ผลลัพธ์เป็น &lt;strong&gt;08:00:2b:00:00:00&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ส่งท้าย
&lt;/h2&gt;

&lt;p&gt;Postgres ได้ให้ประเภทข้อมูล macaddr ซึ่งช่วยให้จัดการข้อมูลเกี่ยวกับการจัดการอุปกรณ์เครือข่ายการใช้งานจริงในการจัดเก็บที่อยู่ MAC ใน PostgreSQL&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;การรักษาความปลอดภัยเครือข่ายเพื่อติดตามอุปกรณ์ที่เข้าถึงเครือข่าย&lt;/li&gt;
&lt;li&gt;การใช้งาน IoT (Internet of Things) เพื่อตรวจสอบอุปกรณ์อัจฉริยะด้วยที่อยู่ MAC เฉพาะ&lt;/li&gt;
&lt;li&gt;การจัดการสินค้าคงคลังและสินทรัพย์ ระบุฮาร์ดแวร์ที่เป็นของบริษัท&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  - ระบบควบคุมการเข้าถึงในการรับรองผู้ใช้ตามที่อยู่ MAC ของอุปกรณ์
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🐘 สรุปส่งท้าย
&lt;/h3&gt;

&lt;p&gt;หวังว่าเทคนิคนี้จะช่วยให้การจัดการ Postgres ของคุณง่ายขึ้นนะครับ! หากคุณกำลังมองหาผู้ช่วยที่เชี่ยวชาญเพื่อเข้ามาจัดการระบบข้อมูลให้เสถียรและ Scale ได้จริง...&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🚀 ให้ iconnext ดูแลคุณ:&lt;/strong&gt; &lt;a href="https://www.iconnext.net/services?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=iconnext_branding&amp;amp;utm_content=post_slug_here"&gt;รับปรึกษาด้าน Database &amp;amp; Data Architecture&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📝 อ่านบทความอื่นในซีรีส์:&lt;/strong&gt; &lt;a href="https://dev.to/everthing-was-postgres?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=internal_series"&gt;ใดๆ ในโลกล้วน Postgres&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤝 ทำความรู้จักกันต่อ:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/watchara-sukka-b25866bb/?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=personal_brand"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://github.com/watchara-sukka/?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=personal_brand"&gt;GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"เปลี่ยนเรื่อง Data ที่วุ่นวาย ให้เป็นแต้มต่อด้วยทีมงานมืออาชีพ"&lt;/strong&gt; — ทีมงาน &lt;a href="https://www.iconnext.net/?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=iconnext_branding"&gt;iconnext&lt;/a&gt;&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>network</category>
      <category>sql</category>
    </item>
    <item>
      <title>รู้จักกับ plv8: เมื่อ Postgres ต้องมาเชื่อมจิตกับ JavaScript</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Tue, 16 Jul 2024 09:41:17 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/ruucchakkab-plv8-emuue-postres-tngmaaechuuemcchitkab-javascript-45no</link>
      <guid>https://dev.to/everthing-was-postgres/ruucchakkab-plv8-emuue-postres-tngmaaechuuemcchitkab-javascript-45no</guid>
      <description>&lt;h2&gt;
  
  
  บทนำ
&lt;/h2&gt;

&lt;p&gt;วันก่อนไปส่อง &lt;a href="https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fkhadev%2Fposts%2Fpfbid0h5iDDRpqpnrSeUTwJvmPapsKRjBBrbHmepK8fSHDKMxhbtYAfu9fF145QNMcQYs4l&amp;amp;show_text=true&amp;amp;width=500" width="500" height="397" rel="noopener noreferrer"&gt;facebook fanpage ขาเดฟ&lt;/a&gt; ซึ่งเป็นแหล่งร่วมตัวเทพ ในวงการ developer ได้โพสเกี่ยวกับส่วนขยาย(extension) ของ postgres ที่ชื่อว่า plv8 ที่ช่วยให้คุณสามารถเขียนฟังก์ชันและทริกเกอร์ด้วยภาษา JavaScript ได้ โดยใช้ V8 JavaScript engine ที่พัฒนาโดย Google&lt;/p&gt;

&lt;h2&gt;
  
  
  แล้วมันดียังไง
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ใช้ JavaScript ในฐานข้อมูล:&lt;/strong&gt; เขียนโค้ด JavaScript ที่ทำงานโดยตรงใน PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ประสิทธิภาพสูง:&lt;/strong&gt; V8 engine มีประสิทธิภาพสูง ทำให้การประมวลผลเร็วกว่าภาษาอื่นๆ เช่น PL/pgSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ความยืดหยุ่น:&lt;/strong&gt; สามารถใช้คุณสมบัติของ JavaScript เช่น closures, high-order functions ได้&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON processing:&lt;/strong&gt; เหมาะสำหรับการทำงานกับข้อมูล JSON ใน PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NPM packages:&lt;/strong&gt; สามารถใช้ JavaScript libraries จาก NPM ได้&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  การใช้งาน
&lt;/h2&gt;

&lt;p&gt;-ติดตั้ง plv8 extension:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="n"&gt;plv8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;การสรา้งและเรียกใช้ฟังก์ชั่น:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;--สรา้งฟังก์ชั่น hellow_world ในการคืนข้อความ "Hello, World!"&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;hello_world&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;--การเรียกใช้ function hello_world--&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;hello_world&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ฟังก์ชันที่ทำงานกับ JSON และใช้ JavaScript Array methods:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;filter_and_transform_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
    &lt;span class="n"&gt;const&lt;/span&gt; &lt;span class="n"&gt;userArray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;const&lt;/span&gt; &lt;span class="k"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;userArray&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="n"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;`${user.firstName} ${user.lastName}`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;isAdult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;emailDomain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'@'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- ตัวอย่างการใช้งาน&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;filter_and_transform_users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'[
    {"firstName": "John", "lastName": "Doe", "age": 25, "email": "john@example.com"},
    {"firstName": "Jane", "lastName": "Smith", "age": 17, "email": "jane@test.com"},
    {"firstName": "Bob", "lastName": "Johnson", "age": 30, "email": "bob@example.com"}
]'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ฟังก์ชันที่ใช้ closure และ state ระหว่าง invocations:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;create_counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
    &lt;span class="n"&gt;const&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;initialize_state&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="k"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="c1"&gt;--;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="k"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- ตัวอย่างการใช้งาน&lt;/span&gt;
&lt;span class="k"&gt;DO&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
    &lt;span class="n"&gt;const&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SELECT create_counter()'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;create_counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOTICE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOTICE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOTICE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decrement&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOTICE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ฟังก์ชันที่ใช้ external library (ต้องติดตั้ง library ก่อน):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;validate_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="nb"&gt;boolean&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
    &lt;span class="n"&gt;const&lt;/span&gt; &lt;span class="k"&gt;validator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'email-validator'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- ตัวอย่างการใช้งาน&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;validate_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;validate_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'invalid-email'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ทริกเกอร์ที่ใช้ PL/V8:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- สรา้งตารางเก็บชื่อผู้ใช้งาน &lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;--สร้างฟังก์ชั่น validate_user() ในการตรวจสอบชื่อผู้ใช้งาน และ email&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;REPLACE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;validate_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;trigger&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="err"&gt;$$&lt;/span&gt;
    &lt;span class="n"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Username must be at least 3 characters long'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!/^&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+@&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="p"&gt;.[&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;elog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Invalid email format'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;NEW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt; &lt;span class="k"&gt;LANGUAGE&lt;/span&gt; &lt;span class="n"&gt;plv8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;--สร้าง trigger ในการเรียกใช้ฟังก์ชั่น validate_user() ในการตรวจสอบชื่อผู้ใช้งาน และ email&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TRIGGER&lt;/span&gt; &lt;span class="n"&gt;user_validation_trigger&lt;/span&gt;
&lt;span class="k"&gt;BEFORE&lt;/span&gt; &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="k"&gt;EACH&lt;/span&gt; &lt;span class="k"&gt;ROW&lt;/span&gt; &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;FUNCTION&lt;/span&gt; &lt;span class="n"&gt;validate_user&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;-- ตัวอย่างการใช้งาน&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'jo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;-- จะ error&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'john'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'invalid-email'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;-- จะ error&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'john'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;-- จะสำเร็จ&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  มีอะไรต้องระวังไหม
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ต้องติดตั้ง PL/V8 extension เพิ่มเติม&lt;/li&gt;
&lt;li&gt;การใช้ JavaScript อาจทำให้การ debug ยากขึ้น&lt;/li&gt;
&lt;li&gt;ต้องระวังเรื่องความปลอดภัย เพราะ JavaScript สามารถเข้าถึงระบบไฟล์ได้&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ส่งท้าย
&lt;/h2&gt;

&lt;p&gt;ส่วนขยาย plv8 ช่วยให้ทาง developer สามารถสร้างฟังก์ชั่นที่ทำงานเฉพาะ ซึ่งฝั่ง developer มีความชำนาญ JavaScript อยู่แล้วโดยไม่ต้องพึ่ง Database Admin (ซึ่งส่วนใหญ่จะไม่ค่อยชำนาญภาษา pl/pgsql) อีกทั้งยังสามารถเรียก  npm เพื่อเพิ่มความสามารถผ่าน javscript อย่างที่ผมเคยบอกว่า postgres เป็นทุกอย่างให้เธอแล้ว&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🚀 ให้ iconnext ดูแลคุณ:&lt;/strong&gt; &lt;a href="https://www.iconnext.net/services?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=iconnext_branding&amp;amp;utm_content=post_slug_here"&gt;รับปรึกษาด้าน Database &amp;amp; Data Architecture&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📝 อ่านบทความอื่นในซีรีส์:&lt;/strong&gt; &lt;a href="https://dev.to/everthing-was-postgres?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=internal_series"&gt;ใดๆ ในโลกล้วน Postgres&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤝 ทำความรู้จักกันต่อ:&lt;/strong&gt; &lt;a href="https://www.linkedin.com/in/watchara-sukka-b25866bb/?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=personal_brand"&gt;LinkedIn&lt;/a&gt; | &lt;a href="https://github.com/watchara-sukka/?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=personal_brand"&gt;GitHub&lt;/a&gt;
&lt;strong&gt;”เปลี่ยนเรื่อง Data ที่วุ่นวาย ให้เป็นแต้มต่อด้วยทีมงานมืออาชีพ"&lt;/strong&gt; — ทีมงาน &lt;a href="https://www.iconnext.net/?utm_source=dev.to&amp;amp;utm_medium=footer&amp;amp;utm_campaign=iconnext_branding"&gt;iconnext&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>javascript</category>
    </item>
    <item>
      <title>การแก้ไขปัญหา: ฐานข้อมูล Postgres ถูกใช้งานโดยผู้ใช้อื่น</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Sun, 14 Jul 2024 09:47:39 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/kaaraekaikhpayhaa-thaankhmuulthuukaichngaanodyphuuaichuuen-4gi6</link>
      <guid>https://dev.to/everthing-was-postgres/kaaraekaikhpayhaa-thaankhmuulthuukaichngaanodyphuuaichuuen-4gi6</guid>
      <description>&lt;p&gt;เมื่อคุณพยายามเข้าถึงหรือลบฐานข้อมูล PostgreSQL และได้รับข้อความแสดงข้อผิดพลาดดังนี้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR: database "database_name" is being accessed by other users
DETAIL: There are 1 other session(s) using the database.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ข้อผิดพลาดนี้เกิดขึ้นเมื่อมีผู้ใช้หรือโปรแกรมอื่นกำลังเชื่อมต่อกับฐานข้อมูลที่คุณพยายามเข้าถึง ต่อไปนี้คือวิธีแก้ไขปัญหา:&lt;/p&gt;

&lt;h2&gt;
  
  
  ขั้นตอนที่ 1: ตรวจสอบเซสชันที่ใช้งานฐานข้อมูล
&lt;/h2&gt;

&lt;p&gt;ใช้คำสั่ง SQL ต่อไปนี้เพื่อดูรายการเซสชันที่กำลังเชื่อมต่อกับฐานข้อมูลของคุณ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_stat_activity&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;datname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;ชื่อฐานข้อมูล&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แทน &amp;lt;ชื่อฐานข้อมูล&amp;gt; ด้วยชื่อฐานข้อมูลที่คุณกำลังตรวจสอบ&lt;br&gt;
คำสั่งนี้จะแสดงข้อมูลเกี่ยวกับเซสชันทั้งหมดที่กำลังใช้งานฐานข้อมูลนั้น รวมถึง PID (Process ID), ชื่อผู้ใช้, แอปพลิเคชันที่เชื่อมต่อ และอื่น ๆ&lt;/p&gt;
&lt;h2&gt;
  
  
  ขั้นตอนที่ 2: ยกเลิกการเชื่อมต่อเซสชัน
&lt;/h2&gt;

&lt;p&gt;หลังจากที่คุณได้ตรวจสอบเซสชันแล้ว คุณสามารถยกเลิกการเชื่อมต่อทั้งหมดโดยใช้คำสั่งต่อไปนี้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;pg_terminate_backend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_stat_get_activity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;datid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pg_database&lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt; &lt;span class="n"&gt;datname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;ชื่อฐานข้อมูล&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แทน &amp;lt;ชื่อฐานข้อมูล&amp;gt; ด้วยชื่อฐานข้อมูลที่คุณต้องการยกเลิกการเชื่อมต่อ&lt;br&gt;
คำสั่งนี้จะยกเลิกการเชื่อมต่อทุกเซสชันที่กำลังใช้งานฐานข้อมูลที่ระบุ&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ข้อควรระวัง&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;การยกเลิกการเชื่อมต่อเซสชันอาจส่งผลกระทบต่อผู้ใช้หรือแอปพลิเคชันอื่นที่กำลังใช้งานฐานข้อมูล ควรใช้ความระมัดระวังและแจ้งเตือนผู้ใช้ก่อนดำเนินการ&lt;/li&gt;
&lt;li&gt;หากเป็นไปได้ ควรตรวจสอบและปิดการเชื่อมต่อจากแอปพลิเคชันหรือผู้ใช้อื่นๆ ก่อนที่จะใช้คำสั่งยกเลิกการเชื่อมต่อโดยตรง&lt;/li&gt;
&lt;li&gt;ในสภาพแวดล้อมการผลิต ควรวางแผนการบำรุงรักษาฐานข้อมูลอย่างรอบคอบเพื่อหลีกเลี่ยงการหยุดชะงักของบริการ
-หลังจากยกเลิกการเชื่อมต่อแล้ว ควรตรวจสอบอีกครั้งเพื่อให้แน่ใจว่าไม่มีเซสชันใหม่เชื่อมต่อเข้ามา&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;การใช้คำสั่งเหล่านี้อย่างระมัดระวังจะช่วยให้คุณจัดการกับปัญหาการเข้าถึงฐานข้อมูลที่ถูกใช้งานโดยผู้ใช้อื่นได้อย่างมีประสิทธิภาพ&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Database Collation ใน PostgreSQL</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Sun, 14 Jul 2024 09:30:35 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/database-collation-ain-postgresql-1dle</link>
      <guid>https://dev.to/everthing-was-postgres/database-collation-ain-postgresql-1dle</guid>
      <description>&lt;h2&gt;
  
  
  Collation คือ
&lt;/h2&gt;

&lt;p&gt;Collation คือชุดกฎที่กำหนดวิธีการเปรียบเทียบและจัดเรียงข้อมูลประเภทข้อความในฐานข้อมูล โดยมีความสำคัญอย่างยิ่งในการจัดการข้อมูลที่เกี่ยวข้องกับภาษาและวัฒนธรรมที่แตกต่างกัน&lt;br&gt;
&lt;strong&gt;โดยมีวัตถุประสงค์หลัก 3 ประการ ดังนี้:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. การเปรียบเทียบข้อมูล:&lt;/strong&gt; ช่วยให้เปรียบเทียบข้อมูลระหว่างชุดข้อมูลต่างๆ ได้อย่างถูกต้อง แม่นยำ&lt;br&gt;
&lt;strong&gt;2. การเรียงลำดับข้อมูล:&lt;/strong&gt; ช่วยให้เรียงลำดับข้อมูลตามเกณฑ์ต่างๆ เช่น ลำดับตัวอักษร ลำดับตัวเลข หรือวันที่&lt;br&gt;
&lt;strong&gt;3. การค้นหาข้อมูล:&lt;/strong&gt; ช่วยให้ค้นหาข้อมูลที่ต้องการได้รวดเร็วและง่ายดาย&lt;/p&gt;
&lt;h2&gt;
  
  
  Collation ภาษาไทยใน  PostgreSQL
&lt;/h2&gt;

&lt;p&gt;PostgreSQL รองรับ Collation หลากหลายภาษา รวมถึงภาษาไทย โดย Collation ภาษาไทยที่นิยมใช้ ได้แก่&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;th-TH-unicode:&lt;/strong&gt; Collation นี้ใช้ Unicode เป็นมาตรฐานในการเปรียบเทียบและเรียงลำดับข้อมูล เหมาะสำหรับการใช้งานทั่วไป&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;th-TH-TIS620:&lt;/strong&gt; Collation นี้ใช้มาตรฐาน TIS620 เป็นมาตรฐานในการเปรียบเทียบและเรียงลำดับข้อมูล เหมาะสำหรับการใช้งานกับระบบเก่า&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;th-TH-dict:&lt;/strong&gt; Collation นี้ใช้พจนานุกรมไทยเป็นมาตรฐานในการเปรียบเทียบและเรียงลำดับข้อมูล เหมาะสำหรับการใช้งานที่ต้องการเรียงลำดับตามหลักภาษาไทยอย่างเคร่งครัด&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  การตั้งค่า Collation
&lt;/h2&gt;

&lt;p&gt;ใน Postgres เราสามารถกำหนด Collation ได้ในระดับ Database, Table, Column โดย&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ในระดับ Database สามารถกำหนดผ่านคำสั่ง
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;ชื่อฐานข้อมูล&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;TH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unicode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;ในระดับ Table
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;ชื่อตาราง&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;TH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unicode&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;ในระดับ Column
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;ชื่อตาราง&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;ชื่อคอลัมถ์&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;TH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unicode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;การใช้งานค้นหาโดยกำหนด
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;mytable&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;TH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unicode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ตัวอย่างการใช้งาน
&lt;/h2&gt;

&lt;p&gt;เพื่อให้เห็นภาพในการใช้งาน Collation ที่เกี่ยวกับการค้นหาจึงขอยกตัวอย่างเป็นภาษาไทยเนื่องจากเป็นบทความภาษาไทย&lt;br&gt;
ตัวอย่างการใช้งาน Collation ภาษาไทยใน PostgreSQL&lt;br&gt;
1.th-TH-x-icu&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- สร้างตารางทดสอบ&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;thai_words&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="nv"&gt;"th-TH-x-icu"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- เพิ่มข้อมูลทดสอบ&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;thai_words&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; 
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'กข'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ขก'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'คำ'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'งู'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'จาน'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ฉลาม'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ชา'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ซุป'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ญาติ'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- ทดสอบการเรียงลำดับ&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;thai_words&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;word
----
กข
ขก
คำ
งู
จาน
ฉลาม
ชา
ซุป
ญาติ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;คำอธิบาย:&lt;/strong&gt; th-TH-x-icu จะเรียงลำดับตามพจนานุกรมภาษาไทย โดยใช้มาตรฐาน ICU ซึ่งรองรับการเรียงลำดับที่ซับซ้อนของภาษาไทยได้ดี&lt;/p&gt;

&lt;p&gt;2.th-TH&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- สร้างตารางทดสอบ&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;thai_names&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="nv"&gt;"th-TH"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- เพิ่มข้อมูลทดสอบ&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;thai_names&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; 
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'สมชาย'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'สมหญิง'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'สมศรี'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'สมศักดิ์'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'สมบัติ'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- ทดสอบการเรียงลำดับ&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;thai_names&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name
----
สมชาย
สมบัติ
สมศรี
สมศักดิ์
สมหญิง
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;คำอธิบาย:&lt;/strong&gt; th-TH จะเรียงลำดับตามมาตรฐานทั่วไปของภาษาไทย แต่อาจไม่ละเอียดเท่า th-TH-x-icu ในบางกรณี&lt;/p&gt;

&lt;p&gt;3.th_TH.utf8&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- สร้างตารางทดสอบ&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;thai_food&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;food&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="nv"&gt;"th_TH.utf8"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- เพิ่มข้อมูลทดสอบ&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;thai_food&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; 
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ต้มยำ'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ผัดไทย'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'แกงเขียวหวาน'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ส้มตำ'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ต้มข่าไก่'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- ทดสอบการเรียงลำดับ&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;thai_food&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;food&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;food
----
แกงเขียวหวาน
ต้มข่าไก่
ต้มยำ
ผัดไทย
ส้มตำ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;คำอธิบาย:&lt;/strong&gt; th_TH.utf8 จะเรียงลำดับตามมาตรฐาน UTF-8 ซึ่งรองรับอักขระพิเศษในภาษาไทยได้ดี&lt;/p&gt;

&lt;p&gt;4.การเปรียบเทียบระหว่าง Collation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- สร้างตารางทดสอบ&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;compare_collations&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;word_icu&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="nv"&gt;"th-TH-x-icu"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;word_th&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="nv"&gt;"th-TH"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;word_utf8&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;COLLATE&lt;/span&gt; &lt;span class="nv"&gt;"th_TH.utf8"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- เพิ่มข้อมูลทดสอบ&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;compare_collations&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; 
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'เก่ง'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'เก่ง'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'เก่ง'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'เกง'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'เกง'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'เกง'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'เก๋ง'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'เก๋ง'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'เก๋ง'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- ทดสอบการเรียงลำดับด้วย Collation ต่างๆ&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="s1"&gt;'ICU'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;collation_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word_icu&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;compare_collations&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;word_icu&lt;/span&gt;
&lt;span class="k"&gt;UNION&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="s1"&gt;'TH'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;collation_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word_th&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;compare_collations&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;word_th&lt;/span&gt;
&lt;span class="k"&gt;UNION&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="s1"&gt;'UTF8'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;collation_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word_utf8&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;compare_collations&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;word_utf8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์อาจแตกต่างกันเล็กน้อยขึ้นอยู่กับเวอร์ชันของ PostgreSQL และการตั้งค่าระบบ แต่โดยทั่วไปจะเห็นความแตกต่างในการจัดเรียงระหว่าง Collation ต่างๆ&lt;br&gt;
&lt;strong&gt;คำอธิบาย:&lt;/strong&gt; ตัวอย่างนี้แสดงให้เห็นว่า Collation ที่ต่างกันอาจให้ผลการเรียงลำดับที่แตกต่างกัน โดยเฉพาะเมื่อเกี่ยวข้องกับวรรณยุกต์และอักขระพิเศษในภาษาไทย&lt;br&gt;
การเลือกใช้ Collation ที่เหมาะสมขึ้นอยู่กับความต้องการเฉพาะของแอปพลิเคชันของคุณ และอาจต้องทดสอบกับข้อมูลจริงเพื่อให้แน่ใจว่าได้ผลลัพธ์ตามที่ต้องการ&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>thai</category>
    </item>
    <item>
      <title>การนำเข้าข้อมูลจากไฟล์ CSV เข้ามาใน Posstgres : ทักษะเบื้องต้นของ Data Engineer</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Sun, 14 Jul 2024 08:38:10 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/kaarnamekhaakhmuulcchaakaifl-csv-ekhaamaaain-posstgres-thaksaebuuengtnkhng-data-engineer-5hgm</link>
      <guid>https://dev.to/everthing-was-postgres/kaarnamekhaakhmuulcchaakaifl-csv-ekhaamaaain-posstgres-thaksaebuuengtnkhng-data-engineer-5hgm</guid>
      <description>&lt;h2&gt;
  
  
  บทนำ
&lt;/h2&gt;

&lt;p&gt;เคยไหม ขณะประชุมการขึ้นระบบ CRM ของฝ่ายขายจะต้องมีการนำรายชื่อลูกค้าของแต่ละคนมาใส่ในฐานข้อมูลพอถามว่าเก็บข้อมูลไว้ที่ไหนจะพบว่าบางคนเก็บใน excle, Google Sheet หรือบางคนจดลงในสมุดก็มีซึ่งพนักงานขายบางคนมีรายชื่อตั้งแต่ 100 ถึง 1,000 &lt;br&gt;
ปัญหาต่อมาคือใครจะคีย์ข้อมูลเข้าระบบ ในห้องประชุมเงียบ ประธานในที่ประชุมสั่งการให้ IT เขียนโปรแกรมดึงข้อมูลลูกค้าเข้าฐานข้อมูล (ช้ำคือเราเป็น admin ต้องสวมมงเป็น programmer ซะแล้ว)&lt;br&gt;
ถ้าเรารับทำเราก็จะกลายเป็น programer อีกตำแหน่ง(ในเงินเดือนเท่าเดิม) ต้องรองรับทั้ง Excel,Number(สำหรับ Mac) และ Google Sheet ไหนจะต้องให้เสร็จตาม timeline ของระบบ CRM ที่จะขึ้นอีก&lt;br&gt;
หนึ่งในวิธีแก้ปัญหาที่ดีที่สุดให้กับคนที่ชอบโยนปัญหาให้เราคือ... โยนปัญหากลับ เราแจ้งให้กับทางที่ประชุมว่าพี่แปลงข้อมูลพี่เป็นไฟล์ CSV ได้ไหมเดี๋ยวผม  import เองเกิดคำถามไปทั้งห้องประชุม ไฟล์ CSV คืออะไร ? &lt;/p&gt;
&lt;h2&gt;
  
  
  CSV คืออะไรกันแน่? 🤔
&lt;/h2&gt;

&lt;p&gt;CSV ย่อมาจาก "Comma-Separated Values" หรือ "ค่าที่คั่นด้วยเครื่องหมายจุลภาค" ในภาษาไทย แต่อย่าเพิ่งกลัวกับชื่อที่ดูเป็นทางการนี้! ลองนึกภาพว่า CSV เป็นเหมือนตารางข้อมูลแบบง่ายๆ ที่แต่ละช่องถูกแบ่งด้วยเครื่องหมายจุลภาค (,)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ชื่อ,อายุ,อาชีพ
สมชาย,30,วิศวกร
สมหญิง,28,นักการตลาด
สมศรี,35,ครู
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เนื่องจากเป็นรูปแบบ text file  สามารถอ่านได้ง่ายจึงสามารถ ใช้ text editor ในการป้อนข้อมูลที่จดไว้ในกระดาษมาใส่ในรูปแบบของ CSV ได้&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ข้อควรระวังเมื่อใช้ CSV 🚨&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ข้อมูลที่มีเครื่องหมายจุลภาค: เช่นตัวเลขจำนวนเงิน เช่น 1,000 ต้องระวังเป็นพิเศษ เพราะอาจทำให้ข้อมูลผิดพลาดได้&lt;/li&gt;
&lt;li&gt;การเข้ารหัสตัวอักษร: บางครั้งอาจมีปัญหากับภาษาที่ไม่ใช่ภาษาอังกฤษ&lt;/li&gt;
&lt;li&gt;ข้อจำกัดด้านความปลอดภัย: ไม่เหมาะสำหรับข้อมูลที่ต้องการความปลอดภัยสูง(เช่นรหัสผ่าน) เพราะไม่มีการเข้ารหัส&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;ซึ่งในโปรแกรมจำพวก Excel,Number(สำหรับ Mac) และ Google Sheet มีความสามารถในการ Save as หรือ Export ข้อมูลเป็นรูปแบบ CSV แทบทุกตัว &lt;/p&gt;

&lt;h2&gt;
  
  
  เมื่อได้ไฟล์ CSV  มาแล้วทำยังไงต่อ
&lt;/h2&gt;

&lt;p&gt;เราสามารถนำข้อมูลจากไฟล์ CSV เข้าสุ่ฐานข้อมูลผ่านคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; &lt;span class="n"&gt;your_table_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="s1"&gt;'/path/to/your/file.csv'&lt;/span&gt;
&lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="s1"&gt;','&lt;/span&gt;
&lt;span class="n"&gt;CSV&lt;/span&gt; &lt;span class="n"&gt;HEADER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;โดย &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you_table_name: เป็นตารางที่ต้องการนำข้อมูลจากไฟล์ ไปเก็บ&lt;/li&gt;
&lt;li&gt;/path/to/your/file.csv: ตำแหน่งไฟล์ CSV ที่เก็บข้อมูล(ต้องระบุเป็น full path)&lt;/li&gt;
&lt;li&gt;คำสั่ง DELIMITER ',': เป็นการบอกให้ใช้เครื่องหมาย , ในการแบ่งข้อมูล&lt;/li&gt;
&lt;li&gt;คำสั่ง CSV HEADER : เป็นการบอกให้ดึงข้อมูลแบบ CSV โดยบอกให้รู้ว่าแถวแรกของไฟล์เป็นชื่อคอลัมน์ ไม่ใช่ข้อมูลจริง&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ข้อควรรู้&lt;/strong&gt;&lt;br&gt;
การนำข้อมูลเข้านอกจากคำสั่งCOPY แล้วยังมี \COPY โดยความแตกต่างกันคือ COPY จะดำเนินการบน server  ในขณะที่  \COPY ดำเนินการบน client&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  บทส่งท้าย
&lt;/h2&gt;

&lt;p&gt;การนำเข้าข้อมูลงฐานข้อมูลเห็นหน้าที่หนึ่งในฐานะ database administrator พึ่งกระทำไม่ใช่หน้าที่ในการเขียนโปรแกรมในการนำเข้าข้อมูล ตัว Postres มีเครื่องมือในการนำเข้าข้อมูลสู่ตารางฐานข้อมูล นำเข้าแล้วอย่าลืมตรวจสอบข้อมูลหลังนำเข้าด้วยล่ะ &lt;br&gt;
จริงแล้วการนำข้อมูลเข้า หรือส่งออกจากฐานข้อมูลถือเป็นทักษธหนึ่งที่ Data Engineer พึงมี&lt;br&gt;
ขอให้มีความสุขกับ ใดๆ โลกล้วน Postgres ด้วยนะครับ&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>csv</category>
      <category>dataengineering</category>
    </item>
    <item>
      <title>คู่มือเอาตัวรอด :การใช้งาน PostgreSQL ผ่าน command line</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Fri, 12 Jul 2024 09:48:14 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/khuumuueeaatawrd-kaaraichngaan-postgresql-phaan-command-line-2f8n</link>
      <guid>https://dev.to/everthing-was-postgres/khuumuueeaatawrd-kaaraichngaan-postgresql-phaan-command-line-2f8n</guid>
      <description>&lt;p&gt;&lt;strong&gt;บทนำ&lt;/strong&gt;&lt;br&gt;
เคยไหม! ช่วงบ่าย 2 ในห้วงเวลาปลายเดือน ในขณะที่คุณกำลังจะเคลิ้มหลับเนื่องจากฤิทธิ์ข้าวเหนียวหมูปิ้งเมื่อมื้อกลางวัน เสียงโทรศัพท์จากหัวหน้า HR ปลุกวิญญาณให้ตื่นจากภวัง&lt;br&gt;
ทาง HR แจ้งว่าไม่สามารถเข้าถึงข้อมูลพนักงานเพื่อที่จะคำนวณเงินเดือนของเดือนนี้ต้องการข้อมูลก่อนเลิกงาน เอาละสิจากพนักงานธรรมดากลายเป็นควมหวังของหมู่บ้านได้ทีนี้มีทางเลือกอะไรบ้าง&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;เปิดจาก Application ไม่สามารถเชื่อมต่อ database ได้&lt;/li&gt;
&lt;li&gt;ติดตั้ง Database Management Application พวก pgAdmin , DBeaver, Navicat etc. ปรากฏว่า ขึ้นไม่สามารถเชื่อมต่อฐานข้อมูลได้&lt;/li&gt;
&lt;li&gt;ping ดูว่า server ไหม? ไม่ล่มแล้วไป เลยทดสอบ telnet (โบราณไป..) ssh ไปยัง server พบแต่หน้าจอดำๆ กับพิมพ์ได้อย่างเดียว แล้วไงต่อ การใช้ command line คือทางออก&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;psql คืออะไร&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
เป็นโปรแกรมสำหรับโต้ตอบกับฐานข้อมูล PostgreSQL   โดยใช้คำสั่ง SQL &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;การใช้งาน&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;เข้าใช้งานด้วยคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$psql&lt;/span&gt; &lt;span class="nt"&gt;-U&lt;/span&gt; &amp;lt;username&amp;gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &amp;lt;database&amp;gt; &lt;span class="nt"&gt;-W&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;username: ชื่อผู้ใช้งานใน postgres&lt;/li&gt;
&lt;li&gt;database: ชื่อฐานข้อมูลที่ต้องการเชื่อมต่อ&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Tips&lt;/u&gt;&lt;/strong&gt; พารามิเตอร์ที่เกี่ยวกับการเชื่อมต่อ&lt;br&gt;
-h, --host=HOSTNAME: database server host or socket directory (ค่าเริ่มต้น: "local socket")&lt;br&gt;
 -d, --dbname=DBNAME: ฐานข้อมูลที่ต้องการเชื่อม(default: "root")&lt;br&gt;
 -p, --port=PORT:port ที่ใช้ในการเชื่อมต่อ (ค่าเริ่มต้น: "5432")&lt;br&gt;
 -U, --username=USERNAME:  ชื่อผู้ใช้งาน (ค่าเริ่มต้น: "root")&lt;br&gt;
 -w, --no-password:ไม่ให้ขึ้น prompt ในการป้อนรหัสผ่าน&lt;br&gt;
 -W, --password: กำหนดให้ขึ้น prompt ในการป้อนรหัสผ่าน(ควรเกิดขึ้นอัติโนมัติ)&lt;br&gt;
เมื่อเข้าสำเร็จจะแสดง prompt ของ postgres&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c"&gt;# &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ที่ postgres prompt ให้พิมพ์คำสั่ง&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\l ดู database ทั้งหมด&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlj9myv5uj5bv25g9p51.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzlj9myv5uj5bv25g9p51.png" alt=" " width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\c &amp;lt;ชื่อฐานข้อมูล&amp;gt; เข้าใช้งานฐานข้อมูลที่ต้องการ&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3klbmyp7ycogpvwyyqm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3klbmyp7ycogpvwyyqm.png" alt=" " width="800" height="97"&gt;&lt;/a&gt;&lt;br&gt;
จะเปลี่ยนเป็น prompt เป็นชื่อฐานข้อมูลนั้น โดยเมื่ออยู่ใน prompt ของฐานข้อมูลแล้วเราสามารถใช้คำสั่ง SQL ในการจัดการข้อมูลในฐานข้อมูลนั้นได้ปรกติ   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\dt ดู table ทั้งหมดใน database ปัจจุบัน&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgl1hs8oyeb4bjqmtdku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgl1hs8oyeb4bjqmtdku.png" alt=" " width="774" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\dt+ ดู size และ description ของ table เพิ่มเติม&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlsck2otniyfl4th6o3i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnlsck2otniyfl4th6o3i.png" alt=" " width="800" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\d &amp;lt;ชื่อตาราง&amp;gt; ดูโครงสร้างของตารางตามที่กำหนด&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75vr7bbwoj74ucxpblkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75vr7bbwoj74ucxpblkp.png" alt=" " width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\dv ดู view ทั้งหมด&lt;/li&gt;
&lt;li&gt;\df ดู function ทั้งหมด&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftq3otfn6p9t6l78d9jkk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftq3otfn6p9t6l78d9jkk.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\dx ดู extension ที่ติดตั้งทั้งหมด&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hqifmxf45sabry8p1ce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6hqifmxf45sabry8p1ce.png" alt=" " width="800" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\du ดู user ทั้งหมด&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bh9xgelffj1b4lglc7x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6bh9xgelffj1b4lglc7x.png" alt=" " width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;\e ทำการเปิด editor เพื่อแก้ไข command(ต้องมีการกำหนดค่า$EDITOR environment variable)&lt;/li&gt;
&lt;li&gt;\s &amp;lt;ชื่อไฟล์&amp;gt; บันทึก comand ลง file ตามชื่อที่กำหนด&lt;/li&gt;
&lt;li&gt;! clear สำหรับ clear หน้าจอ&lt;/li&gt;
&lt;li&gt;\h =&amp;gt; Help&lt;/li&gt;
&lt;li&gt;\? ดูว่ามี command อะไรให้ใช้งานบ้าง&lt;/li&gt;
&lt;li&gt;\q ออก เลิกใช้งาน …&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;หมายเหตุ&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
กรณีที่เราใช้ \c ในการเข้า prompt ของฐานข้อมูลคำสั่งต่างๆ จะแสดงรายการเฉพาะฐานข้อมูลที่เลือก ในกรณีที่ยังไม่กำหนดฐานข้อมูลจะแสดงข้อมูลรายการของทั้ง postgres server&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;แถมท้าย&lt;/strong&gt;&lt;br&gt;
เราสามารถดึงข้อมูลพร้อมexport เป็นไฟล์ CSV ให้หัวหน้า HR นำไปใช้งานต่อ(เย้..เลิกงานพอดีและวันนี้ต้องมีคนทำ otและมีตรได้ฉลองเงินเดือนออก)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;To&lt;/span&gt; &lt;span class="s1"&gt;'/tmp/test.csv'&lt;/span&gt; &lt;span class="k"&gt;With&lt;/span&gt; &lt;span class="n"&gt;CSV&lt;/span&gt; &lt;span class="k"&gt;DELIMITER&lt;/span&gt; &lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="n"&gt;HEADER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;บทส่งท้าย&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
command line เป็นเครื่องมือในการจัดการฐานข้อมูลซึ่งไม่ได้มีเฉพาะใน postgres เท่านั้นฐานข้อมูลอื่นๆ ส่วนมี command line ในการบริหารจัดการฐานข้อมูลได้การที่เราสามารถใช้งานได้จะช่วยเพิ่มทางเลือกในการแก้ปัญหามากขึ้น นอกจากนี้เวลาผู้ใช้เห็นเราใช้ command line แก้ปัญหาจะทำให้ดูหล่อ ประดุจ hacker ในหนังแนวอาชญากรรมทางไซเบอร์ฏ็ไม่ปาน&lt;/p&gt;

</description>
    </item>
    <item>
      <title>ข้อมูล XML บน Postgres : มารู้จักรุ่นพี่ของวงการแลกเปลี่ยนข้อมูลระหว่าง service กัน</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Fri, 12 Jul 2024 06:51:50 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/khmuul-xml-bn-postgres-maaruucchakrunphiikhngwngkaaraelkepliiynkhmuulrahwaang-service-kan-4da4</link>
      <guid>https://dev.to/everthing-was-postgres/khmuul-xml-bn-postgres-maaruucchakrunphiikhngwngkaaraelkepliiynkhmuulrahwaang-service-kan-4da4</guid>
      <description>&lt;h2&gt;
  
  
  บทนำ
&lt;/h2&gt;

&lt;p&gt;ครั้งก่อนเราเคยทำบทความ &lt;a href="https://dev.to/iconnext/khmuul-json-ain-postgresql-olkaihmkhngkaarcchadkaarkhmuulbn-postgres-3omk"&gt;"ข้อมูล JSON ใน PostgreSQL: โลกใหม่ของการจัดการข้อมูลบน Postgres"&lt;/a&gt; ซึ่งเกี่ยวกับการจัดการข้อมูล JSON ไปแล้ววันนี้เราจะมาคุยเรื่องการจัดการข้อมูลแบบ xml กัน&lt;br&gt;
ในยุคสมัยที่มีการแลกเลี่ยนข้อมูลระหว่าง service ผ่าน API โดยส่งข้อมูลในรูปแบบ JSON เคยทราบไหมว่าสมัยก่อน(สมัยนี้บางระบบก็ยังมีอยู่) เคยมีรูปแบบการแลกเปลี่ยนข้อมูลระหว่าง server โดยโปรโตคอลที่เรียกว่า SOAP(Simple Object Access Protocol) ซึ่งเป็นการแลกเปลี่ยนข้อมูลในรูปแบบ XML&lt;/p&gt;
&lt;h2&gt;
  
  
  แล้ว XML คืออะไรล่ะ
&lt;/h2&gt;

&lt;p&gt;XML(Extensible Markup Language)ก็คือภาษาที่ใช้กำหนดโครงสร้างของข้อมูลแบบข้อความคล้ายกับภาษา HTML ซึ่งก็คือภาษากำหนดโครงสรา้งที่แสดงหน้าเว็บยังไงล่ะโดยรูปแบบของ XML จะประกอบด้วย&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;โครงสร้างแบบต้นไม้:&lt;/strong&gt; ข้อมูล XML จะถูกจัดเรียงเป็นโครงสร้างแบบต้นไม้ ประกอบด้วย element attribute และ content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Element:&lt;/strong&gt; หน่วยพื้นฐานของ XML เปรียบเสมือนแท็กใน HTML แต่ละ element จะมีชื่อและอาจมี attribute เพิ่มเติม&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Attribute:&lt;/strong&gt; ข้อมูลเพิ่มเติมเกี่ยวกับ element เก็บไว้ในรูปคู่ key-value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content:&lt;/strong&gt; เนื้อหาที่อยู่ภายใน element อาจเป็นข้อความ element ย่อย หรือ entity references&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document:&lt;/strong&gt; โครงสร้าง XML ทั้งหมด ประกอบด้วย element attribute และ content
ตามตัวอย่าง
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;product&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;name&amp;gt;&lt;/span&gt;สินค้า A&lt;span class="nt"&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;price&amp;gt;&lt;/span&gt;100&lt;span class="nt"&gt;&amp;lt;/price&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;stock&amp;gt;&lt;/span&gt;50&lt;span class="nt"&gt;&amp;lt;/stock&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;categories&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;category&amp;gt;&lt;/span&gt;หมวดหมู่ 1&lt;span class="nt"&gt;&amp;lt;/category&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;category&amp;gt;&lt;/span&gt;หมวดหมู่ 2&lt;span class="nt"&gt;&amp;lt;/category&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/categories&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/product&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;&lt;em&gt;แล้ว Postgres จัดการข้อมูลชนิด XML อย่างไร&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
ตัว postgres ไม่มีประเภทข้อมูล  xml โดย postgres จะดำเนินการผ่าน extension ที่ชื่อ xml2 ซึ่งช่วยให้สามารถจัดเก็บ ประมวลผล และดึงข้อมูล XML ในฐานข้อมูล PostgreSQL ได้อย่างมีประสิทธิภาพ โดยรองรับการจัดการประเภทข้อมูลคือ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;xml: เก็บข้อมูล XML แบบดั้งเดิม(text)&lt;/li&gt;
&lt;li&gt;xmlb: เก็บข้อมูล XML แบบ binary
(เอะคุ้นๆ นะ ดังนั้นข้อดีของ xmlb น่าจะคล้ายกับประเภทข้อมูล json)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;การสร้างคอลัมน์ประเภท XML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;serial&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;varchar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;details&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะเป็นการสร้างตารางที่มีคอลัมน์ details มีข้อมูลชนิด xml ขึ้นมา&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;การเพิ่มข้อมูล XML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'สินค้า A'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;product&amp;gt;&amp;lt;name&amp;gt;สินค้า A&amp;lt;/name&amp;gt;&amp;lt;price&amp;gt;100&amp;lt;/price&amp;gt;&amp;lt;stock&amp;gt;50&amp;lt;/stock&amp;gt;&amp;lt;/product&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;caution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;content_copy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;การดึงข้อมูล XML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;product_name&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;caution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;content_copy&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;การแก้ไขข้อมูล XML&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;products&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;details&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;discount&amp;gt;10&amp;lt;/discount&amp;gt;'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;caution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;ฟังก์ชันสำหรับการประมวลผลข้อมูล XML&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PostgreSQL รองรับฟังก์ชัน XML มากมาย&lt;br&gt;
สำหรับการประมวลผลข้อมูล XML ตัวอย่างฟังก์ชันที่ใช้ทั่วไป ได้แก่:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;xml_parse: แปลงสตริง XML เป็นค่าประเภท XML&lt;/li&gt;
&lt;li&gt;xml_serialize: แปลงค่าประเภท XML เป็นสตริง XML&lt;/li&gt;
&lt;li&gt;xpath: ดึงข้อมูล XML โดยใช้ XPath&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ส่งท้าย&lt;/strong&gt;&lt;br&gt;
ถามว่าเรายังจำเป็นต้องเก็บข้อมูล XML อยู่ไหมผมเคยพัฒนาระบบที่ต้องส่งข้อมูลไปยัง service ที่ใช้ SOAP โปรโตคอลในการเชื่อมต่อซึ่งต้องส่งและเก็บข้อมูลการทำ transaction ย้อนหลังได้ตอนนั้นใช้ Microsoft SQL Server ที่มีประเภทข้อมูลเป็น xml ติดมาด้วย อีกทั้งยังมีอีกหลาย service ที่ยังมีการใช้ SOAP หวังว่าบทความนี้จะเป็นประโยชน์บ้างนะครับ&lt;br&gt;
xml_update: อัปเดตข้อมูล XML&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>xml</category>
    </item>
    <item>
      <title>ข้อมูล JSON ใน PostgreSQL: โลกใหม่ของการจัดการข้อมูลบน Postgres</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Fri, 12 Jul 2024 03:22:09 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/khmuul-json-ain-postgresql-olkaihmkhngkaarcchadkaarkhmuulbn-postgres-3omk</link>
      <guid>https://dev.to/everthing-was-postgres/khmuul-json-ain-postgresql-olkaihmkhngkaarcchadkaarkhmuulbn-postgres-3omk</guid>
      <description>&lt;p&gt;&lt;strong&gt;เกรินนำ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PostgreSQL ไม่เพียงแค่เป็นฐานข้อมูลที่มีความสามารถสูง แต่ยังมีฟีเจอร์สำหรับการจัดการข้อมูล JSON ที่ทรงพลังอีกด้วย วันนี้เราจะพาคุณสำรวจโลกของ JSON ใน PostgreSQL ที่จะทำให้การจัดการข้อมูลของคุณเป็นเรื่องง่ายและสนุกขึ้น!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ว่าแต่ JSON คืออะไร?&lt;/strong&gt;&lt;br&gt;
JSON (JavaScript Object Notation) เป็นรูปแบบข้อมูลที่ใช้สำหรับการแลกเปลี่ยนข้อมูลระหว่างระบบ มีโครงสร้างที่เข้าใจง่ายทั้งสำหรับมนุษย์และเครื่องคอมพิวเตอร์ ซึ่งมักถูกใช้อย่างแพร่หลายในเว็บแอปพลิเคชันและบริการ API ต่าง ๆ&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;รูปแบบของ JSON&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;วัตถุ (Object)&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
วัตถุใน JSON ประกอบด้วยคู่ชื่อ-ค่า (name-value pairs) โดยใช้เครื่องหมาย {} และเครื่องหมายจุลภาค , เพื่อคั่นคู่ชื่อ-ค่าแต่ละคู่:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wonderland"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;อาร์เรย์ (Array)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;อาร์เรย์ใน JSON ประกอบด้วยรายการของค่าโดยใช้เครื่องหมาย [] และเครื่องหมายจุลภาค , เพื่อคั่นค่าต่าง ๆ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Apple"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Banana"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Cherry"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;ประเภทของค่าใน JSON&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;สตริง (String): ข้อความที่อยู่ในเครื่องหมายอัญประกาศคู่ ""
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello, World!"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ตัวเลข (Number): ค่าตัวเลข
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;วัตถุ (Object): ชุดของคู่ชื่อ-ค่า
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;อาร์เรย์ (Array): รายการของค่า
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"item1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"item2"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;บูลีน (Boolean): ค่าความจริง true หรือ false
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ค่าว่าง (Null): ค่าว่าง null
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"example"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;ตัวอย่างที่ซับซ้อนขึ้น&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
แสดง Array ของ user Object  ซึ่งObject user ประกอบด้วยชื่อ(name)และเมือง(city)เป็น String และอายุ(age) เป็น Number&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"users"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wonderland"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Builderland"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"isActive"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"totalUsers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;มาเริ่มจัดการข้อมูล JSON กัน&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;สรา้งตารางที่มี column เป็น JSON&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
เริ่มต้นสร้างตารางขึ้นมาก่อน&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="n"&gt;JSONB&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;สร้างตาราง users ที่มีคอลัมน์ data เป็น JSONB&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;การแทรกข้อมูล JSON&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
การแทรกข้อมูล JSON ก็ง่ายไม่แพ้กัน ลองดูตัวอย่างนี้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'{"name": "Alice", "age": 30, "city": "Wonderland"}'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ง่ายเหมือนการใส่ข้อมูลลงในฐานข้อมูลแบบธรรมดา!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;การค้นหาข้อมูล JSON&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
การค้นหาข้อมูล JSON ใน PostgreSQL นั้นเหมือนการค้นหาในโลกแห่งมายา คุณสามารถใช้คำสั่งนี้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Copy&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'city'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Wonderland'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;คำสั่งนี้จะค้นหาผู้ใช้ที่อาศัยอยู่ในเมือง Wonderland และแสดงชื่อของพวกเขา&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;การอัปเดตข้อมูล JSON&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
การอัปเดตข้อมูล JSON ก็ทำได้ง่ายและรวดเร็ว ลองดูตัวอย่างนี้:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsonb_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'{age}'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'31'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Alice'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เพียงเท่านี้ อายุของ Alice ก็จะถูกอัปเดตเป็น 31 ปี!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;การลบข้อมูล JSON&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
การลบข้อมูล JSON ทำได้โดยการระบุคีย์ที่ต้องการลบ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;Copy&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;
&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'city'&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Alice'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;คำสั่งนี้จะลบข้อมูลเมืองของ Alice ออกไป&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ฟังก์ชั่น และตัวดำเนินการเกี่ยวกับข้อมูล JSON&lt;/strong&gt;&lt;br&gt;
จากการหัวข้อที่ผ่านมาจะพบว่า syntax หลายส่วนจะไม่ตรงตามรูปแบบภาษา SQL นักเนื่องจากประเภทข้อมูล JSON ไม่ใช่ชนิดข้อมูลมาตรฐานของ SQL แต่ Postgres ก็มีเครื่องมือที่ทรงพลังในการจัดการข้อมูลอยู่&lt;br&gt;
***ตัวดำเนินการในการดึงข้อมูล&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;-&amp;gt; (Extract JSON Object Field): ดึงค่า JSON object field โดยไม่แปลงเป็นประเภทอื่น&lt;/li&gt;
&lt;li&gt;-&amp;gt;&amp;gt; (Extract JSON Object Field as Text): ดึงค่า JSON object field และแปลงเป็นข้อความ&lt;/li&gt;
&lt;li&gt;#&amp;gt; (Extract JSON Sub-Object): ดึงค่า JSON sub-object&lt;/li&gt;
&lt;li&gt;#&amp;gt;&amp;gt; (Extract JSON Sub-Object as Text): ดึงค่า JSON sub-object และแปลงเป็นข้อความ
&lt;strong&gt;&lt;em&gt;ฟังก์ชันสำหรับการอัปเดตข้อมูล JSON&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;jsonb_set: อัปเดตค่าใน JSONB&lt;/li&gt;
&lt;li&gt;jsonb_insert: แทรกค่าใหม่ใน JSONB&lt;/li&gt;
&lt;li&gt;jsonb_delete: ลบคีย์ออกจาก JSONB
&lt;strong&gt;&lt;em&gt;ฟังก์ชันสำหรับการสร้างและการตรวจสอบ JSON&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;json_build_object: สร้าง JSON object จากคู่คีย์-ค่า&lt;/li&gt;
&lt;li&gt;jsonb_pretty: จัดรูปแบบ JSONB ให้สวยงาม&lt;/li&gt;
&lt;li&gt;jsonb_typeof: ตรวจสอบประเภทของค่าใน JSONB&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;หมายเหตุ&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
สามารถดูรายละเอียดเพิ่มเติม&lt;br&gt;
&lt;a href="https://www.postgresql.org/docs/current/functions-json.html" rel="noopener noreferrer"&gt;https://www.postgresql.org/docs/current/functions-json.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;ข้อควรรู้&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;- JSON กับ JSONB ไม่เหมือนกันนะ&lt;/strong&gt; JSON กับจะเก็บข้อมูลในรูปแบบ text ในขณะที่ JSONB จะเก็บในรูปแบบ binary ทำให้รองรับการบีบอัดเพื่อประหยัดพื้นที่ และการเข้าข้อมูลแบบสุ่มทำให้เร็วกว่าจึงเหมาะสำหรับการเก็บข้อมูล JSON ที่ต้องการดัดแปลงบ่อย&lt;br&gt;
&lt;strong&gt;- การทำ Index ในข้อมูลชนิด JSON&lt;/strong&gt; แนะนำดัชนีเป็นประเภท B-Tree ซึ่งทำงานได้ดีกว่า&lt;br&gt;
&lt;strong&gt;- ขนาดข้อมูลสูงสุดที่รับได้&lt;/strong&gt; ใน postgres กำหนดค่าเริ่มต้นขนาดเพจไว้ 8KB และกำหนดประเภทข้อมูล  JSON ไว้ 1 เพจดังนั้นขนาดข้อมูลจึงไม่ควรเกิน 8 KB&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;ส่งท้าย&lt;/strong&gt;&lt;br&gt;
หวังว่าบนความนี้จะทำให้เข้าใจข้อมูลประเภท JSON และสนุกกับการจัดการข้อมูลประเภทนี้ผ่าน postgres มากขึ้นเพื่อนำมาใช้ในproject ต่างๆได้ครับแล้วพบกันใหม่ครับ&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>json</category>
      <category>restapi</category>
    </item>
    <item>
      <title>การจัดการ Enum ใน PostgreSQL: เพื่อประสิทธิภาพและความชัดเจนให้ฐานข้อมูลของคุณ</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Mon, 08 Jul 2024 06:48:16 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/kaarcchadkaar-enum-ain-postgres-49e3</link>
      <guid>https://dev.to/everthing-was-postgres/kaarcchadkaar-enum-ain-postgres-49e3</guid>
      <description>&lt;h2&gt;
  
  
  Enum คือ
&lt;/h2&gt;

&lt;p&gt;Enum หรือ Enumerated Type ใน PostgreSQL เป็นเสมือนเซ็ตค่าที่กำหนดไว้ล่วงหน้า ช่วยให้คุณจำกัดข้อมูลในคอลัมน์ให้อยู่ในกรอบที่ต้องการ นึกภาพว่าคุณมีตู้เสื้อผ้าที่มีช่องเฉพาะสำหรับเสื้อผ้าแต่ละประเภท - นั่นแหละคือแนวคิดของ Enum!&lt;br&gt;
ตัวอย่างที่พบบ่อย:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;วันในสัปดาห์: จันทร์, อังคาร, พุธ, ...&lt;/li&gt;
&lt;li&gt;สถานะการส่งสินค้า: กำลังแพ็คของ, กำลังจัดส่ง, จัดส่งสำเร็จ&lt;/li&gt;
&lt;li&gt;ระดับความสำคัญของงาน: ต่ำ, ปานกลาง, สูง&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  การจัดการ Enum
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1.การสร้างประเภทข้อมูล Enum
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TYPE&lt;/span&gt; &lt;span class="n"&gt;mood&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="nb"&gt;ENUM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'happy'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'neutral'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'sad'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;คำสั่งนี้สร้าง Enum ชื่อ 'mood' ที่มีค่าเป็นไปได้ 3 ค่า&lt;/p&gt;

&lt;p&gt;โดยสามารถตรวจสอบ type ที่สรา้งขึ้นผ่านคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nspname&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;enum_schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
       &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;typname&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;enum_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
       &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enumlabel&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;enum_value&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_type&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; 
   &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;pg_enum&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enumtypid&lt;/span&gt;  
   &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;pg_catalog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pg_namespace&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;oid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;typnamespace&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะแสดงรายการ&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wbnoxst580r9cpz1bwp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wbnoxst580r9cpz1bwp.png" alt=" " width="784" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2.การนำ Enum ไปใช้ในตารางข้อมูล
&lt;/h3&gt;

&lt;p&gt;เราสามารถใช้งานมันในตารางได้เหมือนกับประเภทข้อมูลอื่นๆ เพียงระบุชื่อ Enum ในนิยามคอลัมน์&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;daily_log&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;date&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;user_mood&lt;/span&gt; &lt;span class="n"&gt;mood&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="s1"&gt;'happy'&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เป็นการสรา้งตาราง daily_log โดยคอลัมน์ user_mood ซึ่งเป็นประเภทข้อมูล mood Enum ที่สร้างไว้ก่อนหน้า&lt;/p&gt;

&lt;h3&gt;
  
  
  3.การเพิ่มข้อมูลโดยใช้ Enum
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;daily_log&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_mood&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; 
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-07-12'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'happy'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-07-13'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'neutral'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'2024-07-14'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'sad'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.การค้นหาข้อมูลโดยใช้ Enum
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- หาบันทึกทั้งหมดที่ผู้ใช้มีความรู้สึกมีความสุข&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;daily_log&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;user_mood&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'happy'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- หาบันทึกที่ผู้ใช้ไม่มีความสุข&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;daily_log&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;user_mood&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;'happy'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.การอัปเดตข้อมูลใน Enum
&lt;/h3&gt;

&lt;p&gt;การอัปเดตข้อมูลในคอลัมน์ Enum เช่นเดียวกับคอลัมน์ประเภทข้อมูลอื่นๆ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;daily_log&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;mood&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'happy'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ตัวอย่างข้างต้นเปลี่ยนแปลง user_mood ในตาราง dialy_log ที่มีค่า id 3 เป็น happy&lt;/p&gt;

&lt;h3&gt;
  
  
  6.การลบ Enum
&lt;/h3&gt;

&lt;p&gt;การลบ Enum ได้ด้วยคำสั่ง DROP TYPE&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;TYPE&lt;/span&gt; &lt;span class="n"&gt;mood&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;อย่างไรก็ตาม โปรดทราบว่าการลบ Enum จะลบการอ้างอิงทั้งหมดในตารางออกด้วย&lt;/p&gt;

&lt;h2&gt;
  
  
  เทคนิคการใช้ Enum
&lt;/h2&gt;

&lt;h3&gt;
  
  
  การตรวจสอบ
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- ตรวจสอบว่าค่าอยู่ใน Enum หรือไม่&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="s1"&gt;'happy'&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mood&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;-- ทำงานได้&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="s1"&gt;'excited'&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mood&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;-- เกิด error&lt;/span&gt;

&lt;span class="c1"&gt;-- ดึงรายการค่าทั้งหมดของ Enum&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;enum_range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mood&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  การเปรียบเทียบและเรียงลำดับใน Eum
&lt;/h3&gt;

&lt;p&gt;การเรียงลำดับค่า Enum ตามที่ประกาศไว้ เช่นเมื่อเราประกาศ type enum&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;--จากenum mood ที่สร้างขึ้นค่า 'happy' จะถูกเรียงลำดับก่อน 'neutral'&lt;/span&gt;
&lt;span class="c1"&gt;--และ 'neutral'จะถูกเรียงลำดับก่อน'sad'&lt;/span&gt;

&lt;span class="c1"&gt;-- หาบันทึกที่มีความรู้สึกดีกว่า 'neutral'&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;daily_log&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;user_mood&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'neutral'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- หาบันทึกที่มีความรู้สึกที่ไม่ใช่ 'sad'&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;daily_log&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;user_mood&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'sad'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;--เรียงบันทึกความรู้สึกจาก  happy ไปถึง sad&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;daily_log&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;user_mood&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ฟังก์ชัน Enum ในตัว
&lt;/h3&gt;

&lt;p&gt;ใน Postgres มีฟังก์ชันตัวในการจัดการกับ Enum ฟังก์ชันเหล่านี้ช่วยให้คุณสามารถตรวจสอบว่าค่าอยู่ใน Enum หรือไม่ แปลงค่าเป็นตัวอักษร หรือดึงรายการค่าที่เป็นไปได้ทั้งหมด&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- has_any_status(status_array, status)&lt;/strong&gt;: ตรวจสอบว่าค่าใดๆ ใน status_array อยู่ใน status หรือไม่&lt;br&gt;
&lt;strong&gt;-has_status(status, value)&lt;/strong&gt;: ตรวจสอบว่า value อยู่ใน status หรือไม่&lt;br&gt;
&lt;strong&gt;- enum_label(status, value)&lt;/strong&gt;: แปลง value เป็นตัวอักษร&lt;br&gt;
&lt;strong&gt;- enum_range(status)&lt;/strong&gt;: ดึงรายการค่าที่เป็นไปได้ทั้งหมดของ status&lt;/p&gt;

&lt;h2&gt;
  
  
  บทสรุป: Enum - เครื่องมือทรงพลังสำหรับฐานข้อมูลของคุณ
&lt;/h2&gt;

&lt;p&gt;Enum ใน PostgreSQL เป็นเหมือนกล่องเครื่องมือพิเศษที่ช่วยให้คุณจัดการข้อมูลได้อย่างมีประสิทธิภาพ ปลอดภัย และชัดเจน แม้จะมีข้อจำกัดบ้าง แต่ด้วยการใช้งานอย่างชาญฉลาด Enum สามารถยกระดับการทำงานกับฐานข้อมูลของคุณได้อย่างมาก&lt;br&gt;
ลองนำ Enum ไปใช้ในโปรเจกต์ถัดไปของคุณ และสัมผัสถึงความแตกต่างด้วยตัวคุณเอง!สำหรับคอลัมน์ที่มีค่าจำนวนมาก&lt;/p&gt;

&lt;p&gt;โดยรวมแล้ว Enum เป็นเครื่องมือที่มีประสิทธิภาพสำหรับการจัดเก็บข้อมูลประเภทหมวดหมู่ใน Postgres ช่วยให้มั่นใจได้ว่าข้อมูลถูกต้อง ชัดเจน และง่ายต่อการจัดการ&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>data</category>
      <category>datastructures</category>
    </item>
    <item>
      <title>PostgreSQL Extension: ขยายศักยภาพฐานข้อมูลของคุณ</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Thu, 27 Jun 2024 02:58:34 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/waadwy-extension-bn-postgresql-22pn</link>
      <guid>https://dev.to/everthing-was-postgres/waadwy-extension-bn-postgresql-22pn</guid>
      <description>&lt;p&gt;&lt;strong&gt;PostgreSQL Extension&lt;/strong&gt; เป็นคุณลักษณะที่ดีอย่างหนึ่งของฐานข้อมูล Postgres &lt;br&gt;
ที่ช่วยเสริมที่ช่วยเพิ่มประสิทธิภาพการทำงานของระบบฐานข้อมูล โดยทำหน้าที่ขยายฟังก์ชันการทำงานของ PostgreSQL ให้ครอบคลุมไปกว่าที่ติดตั้งมาในระบบพื้นฐาน โมดูลเสริมเหล่านี้สามารถเพิ่มฟีเจอร์ใหม่ ๆ ดังต่อไปนี้&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ชนิดข้อมูลเพิ่มเติม:&lt;/strong&gt; โมดูลเสริมสามารถนำเสนอชนิดข้อมูลใหม่ ๆ ที่ออกแบบมาโดยเฉพาะสำหรับข้อมูลประเภทเฉพาะ เช่น ข้อมูลทางภูมิศาสตร์ หรือ เอกสาร JSON&lt;br&gt;
&lt;strong&gt;ฟังก์ชันและตัวดำเนินการ:&lt;/strong&gt; โมดูลเสริมสามารถจัดเตรียมฟังก์ชันและตัวดำเนินการใหม่ ๆ ที่สามารถใช้ในคิวรี SQL เพื่อดำเนินงานเฉพาะทาง&lt;br&gt;
&lt;strong&gt;ฟีเจอร์ใหม่:&lt;/strong&gt; โมดูลเสริมสามารถนำเสนอฟีเจอร์ใหม่ ๆ เพิ่มเติมให้กับ PostgreSQL โดยสิ้นเชิง เช่น การรองรับการค้นหาแบบเต็มรูปแบบ หรือ การเข้ารหัส&lt;/p&gt;
&lt;h2&gt;
  
  
  ข้อดีของการใช้โมดูลเสริม PostgreSQL
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;เพิ่มฟังก์ชันการทำงาน:&lt;/strong&gt; โมดูลเสริมช่วยให้คุณสามารถทำงานกับ PostgreSQL ได้ในสิ่งที่ไม่สามารถทำได้ในระบบพื้นฐาน&lt;br&gt;
&lt;strong&gt;ความยืดหยุ่น:&lt;/strong&gt; โมดูลเสริมช่วยให้คุณปรับแต่ง PostgreSQL ให้ตรงกับความต้องการเฉพาะของคุณ&lt;br&gt;
&lt;strong&gt;การสนับสนุนจากชุมชน:&lt;/strong&gt; มีชุมชนนักพัฒนาที่สร้างและดูแลรักษาโมดูลเสริม PostgreSQL อยู่มากมาย ดังนั้นคุณจึงมักจะได้รับความช่วยเหลือเมื่อต้องการ&lt;/p&gt;
&lt;h2&gt;
  
  
  สิ่งที่ควรคำนึงถึงเมื่อใช้โมดูลเสริม PostgreSQL:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;โมดูลเสริมไม่ใช่ทุกโมดูลที่สร้างเท่ากัน:&lt;/strong&gt; โมดูลเสริมบางโมดูลได้รับการดูแลรักษาอย่างดีและได้รับความนิยมอย่างกว้างขวาง ในขณะที่โมดูลเสริมอื่น ๆ อาจมีความน่าเชื่อถือที่น้อยกว่า หรือมีเอกสารประกอบที่จำกัด&lt;br&gt;
&lt;strong&gt;ความปลอดภัย:&lt;/strong&gt; สิ่งสำคัญคือต้องระมัดระวังเกี่ยวกับการติดตั้งโมดูลเสริมจากแหล่งที่ไม่น่าเชื่อถือ ตรวจสอบให้แน่ใจว่าคุณเข้าใจว่าโมดูลเสริมทำอะไรก่อนติดตั้ง&lt;br&gt;
&lt;strong&gt;ความเข้ากันได้:&lt;/strong&gt; โมดูลเสริมอาจไม่เข้ากันได้กับ PostgreSQL ทุกเวอร์ชัน&lt;/p&gt;
&lt;h2&gt;
  
  
  การจัดการ Extension
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ในการตรวจสอบ extension ที่อยู่ใน PostgreSQL
&lt;/h3&gt;

&lt;p&gt;สามารถตรวจสอบผ่านคำสั่ง SQL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_available_extensions&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะเป็น view ในการแสดงรายการ extension ที่พร้อมใช้งาน ใน server ของเราโดยจะแสดงข้อมูล&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x4qi9hqm4v12lr7w2sc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0x4qi9hqm4v12lr7w2sc.png" alt=" " width="800" height="204"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name: ชื่อ extension&lt;/li&gt;
&lt;li&gt;default_version:&lt;/li&gt;
&lt;li&gt;install_version: เวอร์ชั่นที่ทำการติดตั้งอยู่ในฐานข้อมูล&lt;/li&gt;
&lt;li&gt;comment: คำอธิบาย extension&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  การตรวจสอบ Extension ที่ติดตั้งบนฐานข้อมูล
&lt;/h3&gt;

&lt;p&gt;สามารถทำผ่านคำสั่ง SQL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;pg_extension&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะแสดงรายการที่ extension ติดตั้งในฐานข้อมูล&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgmbujvs09plpxb1naq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flgmbujvs09plpxb1naq3.png" alt=" " width="800" height="63"&gt;&lt;/a&gt;&lt;br&gt;
โดยแสดงข้อมูล&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;oid: object id ของ extension
&lt;/li&gt;
&lt;li&gt;extname:ชื่อ extension&lt;/li&gt;
&lt;li&gt;extowner: id owner ของ object &lt;/li&gt;
&lt;li&gt;extnamespace&lt;/li&gt;
&lt;li&gt;extrelocatable&lt;/li&gt;
&lt;li&gt;extversion: version ของ extension &lt;/li&gt;
&lt;li&gt;extconfig: &lt;/li&gt;
&lt;li&gt;extcondition: &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ในการติดตั้งเข้าไปในฐานข้อมูลผ่านคำสั่ง
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;extension_name&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อ extension_name เป็นชื่อที่ต้องการติดตั้ง&lt;/p&gt;

&lt;p&gt;ในการถอดถอน extension ออกจากฐานจ้อมูลผ่านคำสั่ง&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;คำเตือน&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
1.คุณต้องมีสิทธิ์ CREATE EXTENSION ในฐานข้อมูลที่คุณต้องการติดตั้ง extension&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ตรวจสอบให้แน่ใจว่าคุณดาวน์โหลด extension ที่ถูกต้องสำหรับเวอร์ชัน PostgreSQL ของคุณ&lt;/li&gt;
&lt;li&gt;บาง extension อาจมีข้อกำหนดเบื้องต้นเพิ่มเติม โปรดอ่านเอกสารประกอบของ extension สำหรับข้อมูลเพิ่มเติม
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;extension_name&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อ extension_name เป็นชื่อที่ต้องการติดตั้ง&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;คำเตือน&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;คุณต้องมีสิทธิ์ DROP EXTENSION ในฐานข้อมูลที่คุณต้องการถอดถอน Extension&lt;/li&gt;
&lt;li&gt;ตรวจสอบให้แน่ใจว่าคุณได้ลบวัตถุใดๆ ที่สร้างโดย Extension ออกก่อน มิฉะนั้น คุณอาจได้รับข้อความแสดงข้อผิดพลาด&lt;/li&gt;
&lt;li&gt;บาง Extension อาจมีขั้นตอนการถอนการติดตั้งเพิ่มเติม โปรดอ่านเอกสารประกอบของ Extension สำหรับข้อมูลเพิ่มเติม&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  กรณีที่ต้องการติดตั้ง Extension ที่ไม่ปรากฏในรายการที่อยู่ Postgres
&lt;/h2&gt;

&lt;p&gt;ในบาง extension ไม่ปรากฏผ่าน pg_available_extensions ให้ไม่สามารถติดตั้ง extension บนฐานข้อมูลได้ถ้าต้องการติดตั้ง&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ดาวน์โหลดซอร์สโค้ด Extension&lt;/strong&gt;: คุณสามารถดาวน์โหลดซอร์สโค้ด Extension จากเว็บไซต์ของผู้พัฒนา&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;คอมไพล์ Extension:&lt;/strong&gt; ขั้นตอนการคอมไพล์ Extension แตกต่างกันไปขึ้นอยู่กับ Extensionโปรดดูเอกสารประกอบของ Extension สำหรับข้อมูลเพิ่มเติม&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ติดตั้ง Extension:&lt;/strong&gt; หลังจากคอมไพล์ Extension แล้ว คุณสามารถติดตั้ง Extension ได้โดยใช้คำสั่ง SQL CREATE EXTENSION&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;ข้อควรระวัง:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ติดตั้ง Extension จากแหล่งที่เชื่อถือได้เท่านั้น&lt;/li&gt;
&lt;li&gt;ตรวจสอบให้แน่ใจว่า Extension เข้ากันได้กับเวอร์ชัน PostgreSQL ของคุณ&lt;/li&gt;
&lt;li&gt;บาง Extension อาจมีข้อกำหนดเบื้องต้นเพิ่มเติม โปรดอ่านเอกสารประกอบของ Extension สำหรับข้อมูลเพิ่มเติม&lt;/li&gt;
&lt;li&gt;ก่อนติดตั้ง Extension ใดๆ โปรดสำรองฐานข้อมูลของคุณไว้ก่อน&lt;/li&gt;
&lt;li&gt;ตรวจสอบให้แน่ใจว่าคุณเข้าใจผลกระทบของ Extension ที่คุณกำลังติดตั้ง&lt;/li&gt;
&lt;li&gt;บาง Extension อาจส่งผลต่อประสิทธิภาพการทำงานของ PostgreSQL ของคุณ&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Postgres ต้องรอด!: วิธีกู้คืนรหัสผ่านผู้ใช้ postgres เมื่อลืมแบบฉุกเฉิน</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Sat, 22 Jun 2024 09:17:12 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/kaar-reset-password-khngphuuaichngaan-postgres-ainkrniithiiluuem-pasword-54pd</link>
      <guid>https://dev.to/everthing-was-postgres/kaar-reset-password-khngphuuaichngaan-postgres-ainkrniithiiluuem-pasword-54pd</guid>
      <description>&lt;h2&gt;
  
  
  เกริ่นนำ
&lt;/h2&gt;

&lt;p&gt;หนึ่งในหน้าที่ของ database adminที่ต้องเผชิญคือการรับมรดกบาปจาก admin คนเก่า, vendor หรือแม้กระทั้งตัวเอง&lt;br&gt;
หัวหน้าฝ่ายการตลาดต้องการสรุป สรุป ข้อมูลการขายของไตรมาสนี้บนระบบ erp ขณะที่เราใช้ pgAdmin หลังจากใช่ username และ password คลิกปุ่ม Login หน้าจอแสดง "username/password is not valid" ว่าแต่ password คืออะไรหว่า ? สิ่งที่ปรกติแล้วในกรณีหาแล้วไม่เจอคือ&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;โทรหา IT คนเก่าคำตอบคือ จำไม่ได้หรอกลองถาม vendor ดูไหมเผื่อจำได้(ไปข้อ 2.)&lt;/li&gt;
&lt;li&gt;โทรถาม vender คำตอบคือผมให้ข้อมูล IT คนเก่าไปหมดแล้ว(ไปข้อ 3)&lt;/li&gt;
&lt;li&gt;ลองหาตามไฟล์ หรือสมุดโน้ต(ถ้าจำได้ หรือเจอจะไปข้อ 1 ทำไม)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ดูทรงน่าจะเริ่มติดลูป แหละ reset password user postgres เลยละกันหัวหน้าตามแหละว่าแต่ user ที่ชื่อ postgres เป็นใคร? &lt;/p&gt;
&lt;h2&gt;
  
  
  ผู้ใช้งาน postres เป็นใคร
&lt;/h2&gt;

&lt;p&gt;postgres เป็นผู้ใช้งานที่เหมือนเป็นนักการเมืองท้องถิ่นที่สามารถบริหารจัดการทุกอย่างของท้องถิ่นที่ชื่อว่า PostgreSQL (ก็เหมือนกับ sa ที่สามารถบริหารจัดการท้องถิ่นที่ชื่อว่า SQL Server นั่นแหละ)&lt;br&gt;
ในตอนติดตั้งระบบฐานข้อมูล PostqreSQL ขึ้นมาจะมีการสร้างผู้ใช้งานชื่อ postgres ข้ึนมาโดยอัติโนมัติเพื่อบริหารจัดการฐานข้อมูลเบื้องต้น&lt;br&gt;
ในบางสถานการณ์ที่เราลืมรหัสผ่านของผู้ใช้งาน postgres ทำให้ไม่สามารถ&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;สร้างฐานข้อมูลใหม่&lt;/li&gt;
&lt;li&gt;จัดการสิทธิ์ผู้ใช้&lt;/li&gt;
&lt;li&gt;ปรับแต่งการตั้งค่าระบบ&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  การ reset password ของผู้ใช้งาน postgres
&lt;/h2&gt;

&lt;p&gt;อย่างแรกไปยังหน้า command line ของระบบปฏิบัติการนั้นจะเดินไปหน้าเครื่องก็ได้จะรีโมทโดย ssh ก็ได้(อย่าใช้ telnet เชียวโดน IT manager ล้อตาย)&lt;br&gt;
โดยในการ reset password จะดำเนินการผ่านไฟล์ pg_hba.conf ซึ่งจะอยู่ที่ตำแหน่ง &lt;strong&gt;/var/lib/postgresql/data&lt;/strong&gt; บน linux หรือ &lt;strong&gt;C:\Program Files\PostgreSQL\16\data&lt;/strong&gt; บน Windows โดยไฟล์ดังกล่าวมีหน้าที่ในการควบคุมการ authentication จาก client ที่เชื่อมต่อเข้ามาโดย hba ย่อมาจาก host base authentication&lt;/p&gt;

&lt;p&gt;1.ทำการสำรองไฟล์ pg_hba.conf&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# cp pg_hba.conf pg_hba.conf.bak&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;เกร็ดความรู้: pg_hba.conf ย่อมาจาก "PostgreSQL Host-Based &amp;gt;Authentication Configuration" ไฟล์นี้ควบคุมวิธีการที่ PostgreSQL ตรวจสอบและอนุญาตการเชื่อมต่อจากไคลเอนต์&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;2.เแก้ไขไฟล์ pg_hba.conf &lt;br&gt;
เปิดไฟล์ด้วย text editor ที่คุณถนัด เช่น nano หรือ vim จากนั้นไปบริเวณท้ายไฟล์ในบรรทัดที่เป็น host all all all scram-sha-256 ให้เปลี่ยนคำว่า scram-sha-256 เป็น trust จากนั้นทำการบันทึกไฟล์&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kofqr8eroe7wc92u1yf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3kofqr8eroe7wc92u1yf.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;คำเตือน: การเปลี่ยนเป็น "trust" จะอนุญาตการเชื่อมต่อโดยไม่ต้องใช้รหัสผ่าน ใช้เฉพาะในกรณีฉุกเฉินและอย่าลืมเปลี่ยนกลับ!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;3.ทำการ restart service PostgreSQL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# pg_ctl restart&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.ทำการเข้า PostgreSQL อีกครั้งผ่านคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# psql -U postgres&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5.จะเข้ามายัง shell ของ PostgreSQL โดยไม่ต้องป้อนรหัสผ่านจากนั้นให้ทำการเปลี่ยนรหัสผ่านผ่านคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;=#&lt;/span&gt; &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="n"&gt;postgres&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;PASSWORD&lt;/span&gt; &lt;span class="s1"&gt;'new_password'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อ new_password เป็นรหัสผ่านใหม่&lt;br&gt;
6.นำค่า pg_hba.conf ที่สำรองไว้แทน pg_hba.conf ที่แก้ค่าไปจากนั้นทำการrestart PostgreSQL service  แล้วทดสอบเข้า psql โดยใช้ รหัสผ่านที่ตั้งใหม่&lt;/p&gt;

&lt;h2&gt;
  
  
  ส่งท้าย
&lt;/h2&gt;

&lt;p&gt;ปัญหาการลืมรหัสผ่านเป็น ปัญหาคลาสสิคของ database admin หวังว่าบทความนี้จะเป็นดั่งยาสามัญประจำบ้าน ช่วยให้เรารอดจากวิกฤติได้&lt;/p&gt;

</description>
    </item>
    <item>
      <title>การสร้างผู้ใช้และให้สิทธิความเป็นเจ้าของฐานข้อมูล PostgreSQL บน Ubuntu</title>
      <dc:creator>Watchara Sukka</dc:creator>
      <pubDate>Sat, 22 Jun 2024 02:39:23 +0000</pubDate>
      <link>https://dev.to/everthing-was-postgres/kaarsraangphuuaichngaan-aelaaihsiththikhwaamepnecchaakhngthaankhmuul-postgresql-bn-ubuntu-9pk</link>
      <guid>https://dev.to/everthing-was-postgres/kaarsraangphuuaichngaan-aelaaihsiththikhwaamepnecchaakhngthaankhmuul-postgresql-bn-ubuntu-9pk</guid>
      <description>&lt;h2&gt;
  
  
  บทนำ
&lt;/h2&gt;

&lt;p&gt;ในฐานะ database administrator เราต้องมีการสรา้งฐานข้อมูลให้  ทีม developer ในการบริหารจัดการระบบที่จะพัฒนาขึ้น ในการสรา้งฐานข้อมูล postgres ซึ่งจะเป็นเจ้าของฐานข้อมูลทุกตัวที่สร้างขึ้นมา จะให้รหัสผ่าน postgres กับทีม developor กระดากใจ จะสร้างผู้ใช้งานและกำหนดสิทธิ ก็เดี๋ยวต้องมาคอยกำหนดสิทธิเพิ่มเติมอีกให้ว้าวุ่นกันอีก(เพราะในกระบวนพัฒนาระบบโครงสร้างข้อมูลยังไม่นิ่ง) ดังนั้นวิธีดีคือ เราจึงต้องสร้างผู้ใช้งาน และมอบสิทธิความเป็นเจ้าของ(owner)ให้ฐานข้อมูลนั้นเพื่อให้สามารถเข้าถึงฐานข้อมูลนั้น และในกรณีที่รหัสผ่านของผู้ใช้งานนั้นหลุดก็มีผลกระทบแค่กับฐานข้อมูลนั้น&lt;/p&gt;

&lt;p&gt;บทความนี้จะแสดงการสร้างผู้ใช้งาน และให้สิทธิความเป็นเจ้าของฐานข้อมูล PosgreSQL ผ่าน command line บน Ubuntu Linux&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;วิธีดังกล่าวสามารถนำไปใช้กับ PostgreSQL ที่ติดตั้งในระบบปฏิบัติอื่นๆได้&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  การสร้างผู้ใช้งานใหม่บน PostgreSQL
&lt;/h2&gt;

&lt;p&gt;1.เข้าใช้งาน psql เพื่อเข้าใช้งาน PostGreSQL ผ่าน command line ที่ terminal ใน Ubuntu พิมพ์&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# sudo -u postgres psql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะเข้าสู่ shell ของ postgres&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;postgres-#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.แสดงรายการผู้ใช้งานใน PostgreSQL ผ่านคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;postgres-# &lt;span class="se"&gt;\d&lt;/span&gt;u หรือ &lt;span class="se"&gt;\d&lt;/span&gt;u+ 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;จะแสดงรายชื่อผู้ใช้งานในฐานข้อมูล&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljnoa1fkcghva0dsl8f2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fljnoa1fkcghva0dsl8f2.png" alt=" " width="800" height="56"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.สรา้งผู้ใช้งานชื่อ demo โดยกำหนดรหัสผ่านเป็น demo1234 ผ่านคำสั่ง SQL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;-#&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="n"&gt;demo&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;PASSWORD&lt;/span&gt; &lt;span class="s1"&gt;'demo1234'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่อใช้คำสั่ง \du จะพบชื่อผู้ใช้งาน demo ที่สร้างขึ้นใหม่&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz64395mc4gkh76qkupk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz64395mc4gkh76qkupk5.png" alt=" " width="800" height="101"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  การมอบสิทธิเจ้าของฐานข้อมูลให้ผู้ใช้งานที่สร้างขึ้น
&lt;/h2&gt;

&lt;p&gt;1.สรา้งฐานข้อมูล demodb ผ่านคำสั่ง SQL&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;-#&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;demodb&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.มอบทุกสิทธิในฐานข้อมูล  demodb ให้กับผู้ใช้งาน demo ผ่านคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;-#&lt;/span&gt; &lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt; &lt;span class="k"&gt;PRIVILEGES&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;demodb&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3.มอบสิทธิความเป็นเจ้าของ demodb ให้กับผู้ใช้งาน demo ผ่านคำสั่ง&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;-#&lt;/span&gt; &lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;demodb&lt;/span&gt; &lt;span class="k"&gt;OWNER&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4.ตรวจสอบความเป็นเจ้าของฐานข้อมูล โดยใช้ \l แสดงรายชื่อฐานข้อมูล&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;postgres-# &lt;span class="se"&gt;\l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ในรายชื่อฐานข้อมูล demodb ที่คอลัมถ์ Owner จะแสดงค่าเป็น demo&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhorymah629uwu44oake.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkhorymah629uwu44oake.png" alt=" " width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;หมายเห&lt;/u&gt;&lt;/strong&gt;ตุ เราสามารถสร้างฐานข้อมูลพร้อมกำหนดเจ้าของได้ในคำสั่งเดียวผ่าน&lt;/p&gt;


&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;-#&lt;/span&gt; &lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;demodb&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;OWNER&lt;/span&gt; &lt;span class="n"&gt;demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;จะเป็นการสรา้งฐานข้อมูล demodb พร้อมกับกำหนดเจ้าของเป็น demo ในคำสั่งเดียว&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  บทส่งท้าย
&lt;/h2&gt;

&lt;p&gt;ก็จะมีคำถามต่อมาว่า ถ้ารหัสผ่านของผู้ใช้ที่สร้างมาหลุดไปก็ไม่ปลอดภัยสิ ซึ่งเมื่อระบบขึ้นใช้งานจริงแล้วเราสามารถจำกัดสิทธิบางอย่างของผู้ใช้งานนั้นได้ หรือสร้างผู้ใช่งานใหม่โดยกำหนดสิทธิเท่าที่จำเป็น และใช้ผู้ใช้งานนั้นในการเชื่อมต่อฐานข้อมูล&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
